gee*_*ubb 8 .net c# sitecore sitecore7
我最近一直在将内容和代码库从旧的Sitecore CMS 6.5安装(具有大量自定义)迁移到CMS 7.0的全新安装.
在原始站点中,Single-line text已使用字段将任意Javascript呈现到页面中(用于跟踪).这工作正常,Javascript被渲染到页面中,未编码并按预期执行.
但是在新安装中我注意到内容现在是HTML编码的,这意味着它不会在我正在使用的Sitecore 7安装下执行.
在我的Sublayout中,我有一个像这样的FieldRenderer:
<sc:FieldRenderer ID="tracker" FieldName="Script" runat="server" />
Run Code Online (Sandbox Code Playgroud)
我不确定是否存在我未迁移的自定义/配置,或者这是否是Sitecore 7中引入的更改(可能出于安全原因).
任何人都可以对此有所了解吗?我是否需要创建自己的字段类型以允许所需的行为,或者我是否可以通过"开箱即用"字段类型执行此操作?
小智 10
我从Sitecore 6.5和7中检查了GetTextFieldValue处理器类,看起来不同
这来自Sitecore 6.5:Sitecore.Pipelines.RenderField.GetTextFieldValue
public void Process(RenderFieldArgs args)
{
Assert.ArgumentNotNull((object) args, "args");
string fieldTypeKey = args.FieldTypeKey;
if (fieldTypeKey != "text" && fieldTypeKey != "single-line text")
return;
args.WebEditParameters.Add("prevent-line-break", "true");
}
Run Code Online (Sandbox Code Playgroud)
这个来自Sitecore 7:Sitecore.Pipelines.RenderField.GetTextFieldValue
public void Process(RenderFieldArgs args)
{
Assert.ArgumentNotNull((object) args, "args");
string fieldTypeKey = args.FieldTypeKey;
if (fieldTypeKey != "text" && fieldTypeKey != "single-line text")
return;
args.WebEditParameters.Add("prevent-line-break", "true");
args.Result.FirstPart = HttpUtility.HtmlEncode(args.Result.FirstPart);
}
Run Code Online (Sandbox Code Playgroud)
你可以在Sitecore 7的Process方法的最后一行代码上看到结果被编码.您可以为GetTextField处理器创建自己的类并将其添加到RenderField管道,但我建议您将字段从单行文本更改为多行文本或备注字段.
我检查了Sitecore 6.5和7上的Sitecore.Pipelines.RenderField.GetMemoFieldValue类,并且实现相同,结果未编码:
namespace Sitecore.Pipelines.RenderField
{
/// <summary>
/// Implements the RenderField.
///
/// </summary>
public class GetMemoFieldValue
{
/// <summary>
/// Gets the field value.
///
/// </summary>
/// <param name="args">The arguments.</param>
public void Process(RenderFieldArgs args)
{
string fieldTypeKey = args.FieldTypeKey;
if (fieldTypeKey != "memo" && fieldTypeKey != "multi-line text")
return;
string linebreaks = args.RenderParameters["linebreaks"];
if (linebreaks == null)
return;
args.Result.FirstPart = GetMemoFieldValue.Replace(args.Result.FirstPart, linebreaks);
args.Result.LastPart = GetMemoFieldValue.Replace(args.Result.LastPart, linebreaks);
args.WebEditParameters.Add("linebreak", "br");
}
/// <summary>
/// Replaces the specified linebreaks.
///
/// </summary>
/// <param name="linebreaks">The linebreaks.</param><param name="output">The output.</param>
/// <returns>
/// The replace.
/// </returns>
private static string Replace(string output, string linebreaks)
{
output = output.Replace("\r\n", linebreaks);
output = output.Replace("\n\r", linebreaks);
output = output.Replace("\n", linebreaks);
output = output.Replace("\r", linebreaks);
return output;
}
}
}
Run Code Online (Sandbox Code Playgroud)
GetTextField的代码已在Sitecore 6.6 Update 3上更新,您可以在发布历史记录中看到:
页面编辑器在6.6 Update-3中,管道在修改单行文本字段时被修改为HTML编码字段值(参见编号327905).这在显示编码值的页面编辑器中无法正常工作.如果用户保存了页面,则已编码的值将再次进行HTML编码.(384997)
我希望它有所帮助.
似乎很多人都对这篇文章感到困惑,并开始越来越多地要求上面提到的修复.
FieldRenderer中似乎存在一个错误,它阻止呈现HTML标记Sitecore CMS不进行HTML编码
Sitecore CMS 在版本6.6 rev之前渲染单行文本字段和链接字段时没有HTML编码字段值.131111(6.6 Update-3).由于此问题,从单行文本和链接字段输出值的页面不会通过W3C标记验证.
根据Sitecore CMS发行说明,自Sitecore CMS 6.6 rev以来,此问题已得到解决.131111(又名更新-3)
然后它自Sitecore CMS 6.6.0 rev以来得到了改进.130404(又名更新-5)
并且自CMS 6.6.0 rev.130529(又名Service Pack-1)
从6.6版本开始.131111(6.6 Update-3)和更高版本的Sitecore CMS HTML 使用HttpUtility.HtmlEncode方法对单行文本字段和链接字段的值进行编码.
这些更改已在GetTextValue处理器以及Sitecore.Xml.Xsl.LinkRenderer类中引入.
<renderField>
...
<processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />
...
</renderField>
Run Code Online (Sandbox Code Playgroud)
您可以与支持人员联系,他们了解问题并提供修复程序.你应该要求Sitecore.Support.381846.dll
Sitecore.Support.381846程序集修改了GetTextFieldValue处理器,其中缺少以下代码行.
args.Result.FirstPart = HttpUtility.HtmlEncode(args.Result.FirstPart);
Run Code Online (Sandbox Code Playgroud)
这个"修复"只会带来单行文本字段的旧行为.换句话说,它引用了旧的问题,参考编号为#327905(详见上文).
升级到Sitecore CMS 6.6 Update-3及更高版本后,为什么我的Sitecore解决方案中的所有内容都已损坏?因为您错误地使用单行文本字段.此字段类型不会存储HTML或JavaScript.这是用于存储内容值的内容字段类型.如果您在内容字段中存储HTML标记和JavaScript,则表示您不遵循Sitecore最佳实践.
我希望这有助于说清楚.
祝福,Oleg Burov
Sitecore CMS和DMS 7.2 rev.141226(又名7.2 Update-3)引入了文件中的Rendering.HtmlEncodedFieldTypes设置,该设置Web.config指定了管道分隔的字段类型列表,这些字段类型在由<renderField>管道呈现时应该是HTML编码的.
<!-- RENDERING - HTML ENCODED FIELD TYPES
Specifies a pipe-separated list of field types that should be HTML encoded when rendered by the <renderField> pipeline.
Default value: text|single-line text
-->
<setting name="Rendering.HtmlEncodedFieldTypes" value="text|single-line text" />
Run Code Online (Sandbox Code Playgroud)
现在,您可以控制哪些Sitecore字段类型应该是或不应该是HTML编码的.
| 归档时间: |
|
| 查看次数: |
5607 次 |
| 最近记录: |