Sitecore FieldRenderer输出CMS 6.5和7.0之间的差异

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)

我希望它有所帮助.


Ole*_*rov 5

似乎很多人都对这篇文章感到困惑,并开始越来越多地要求上面提到的修复.

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)

布局和渲染

  • 在渲染单行文本字段和链接字段时,管道没有对字段值进行HTML编码.(327905)注意:渲染链接字段时对字段值进行编码会产生意外的副作用.因此,链接字段的字段值不再在6.6 Update-5及更高版本中编码(参考编号382059).[2013年4月17日添加]
  • 在呈现链接字段时,LinkRenderer类不对title属性的值进行编码.(327905,347361)[更新于2014年1月15日]

然后它自Sitecore CMS 6.6.0 rev以来得到了改进.130404(又名更新-5)

布局和渲染

  • 在6.6 Update-3中,管道在渲染链接字段时被修改为HTML编码字段值(参考号327905).事实证明,这会产生意想不到的副作用,例如在链接字段中嵌入IMG时.因此,链接字段的字段值不再在6.6 Update-5及更高版本中编码.(382059)

并且自CMS 6.6.0 rev.130529(又名Service Pack-1)

页面编辑器

  • 在6.6 Update-3中,管道在修改单行文本字段时被修改为HTML编码字段值(参见编号327905).这在显示编码值的页面编辑器中无法正常工作.如果用户保存了页面,则已编码的值将再次进行HTML编码.(384997)

从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最佳实践.

摘要:

  1. Sitecore CMS中的参考编号#381846(Sitecore.Support.381846.dll)没有问题.
  2. 自Sitecore CMS 6.6 Update-3以来,实际问题#327905已经解决.
  3. Sitecore HTML编码单行文本链接字段类型.
  4. 不要在内容字段(如单行文本)中存储HTML和Java脚本或任何与演示文稿相关的元数据.否则,如果在单行文本 字段中错误地更改HTML/JavaScript,内容编辑器很可能会破坏整个页面呈现.
  5. 内容及其演示文稿必须分开并单独存储.

我希望这有助于说清楚.

祝福,Oleg Burov

更新1:

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编码的.