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

时间:2014-01-10 16:05:26

标签: c# .net 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" />

我不确定是否存在我未迁移的自定义/配置,或者这是否是Sitecore 7中引入的更改(可能出于安全原因)。

任何人都可以对此有所了解吗?我是否需要创建自己的字段类型以允许所需的行为,或者我是否可以通过“开箱即用”字段类型执行此操作?

4 个答案:

答案 0 :(得分: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");
    }

这个来自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);
}

您可以在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;
    }
  }
}

GetTextField代码已在Sitecore 6.6 Update 3上更新,您可以在release history上看到:

  

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

我希望它有所帮助。

答案 1 :(得分:5)

似乎很多人都对此帖感到困惑,并开始越来越多地要求上述修复。

  

FieldRenderer中似乎存在一个阻止呈现HTML标记的错误   Sitecore CMS不进行HTML编码

在版本6.6 rev之前呈现单行文本字段和链接字段时,Sitecore CMS没有对字段值进行HTML编码。 131111(6.6 Update-3)。由于此问题,从单行文本链接字段输出值的页面未通过W3C标记验证。

根据Sitecore CMS发行说明,自Sitecore CMS 6.6 rev以来,此问题已得到解决。 131111(又名Update-3)

布局和渲染

  • 管道没有HTML 在渲染单行文本字段时编码字段值 链接字段。 (327905)注意:渲染时对字段值进行编码 链接字段被证明有意想不到的副作用。场 因此,不再在6.6 Update-5中编码链接字段的值 后来(参考编号382059)。 [2013年4月17日添加]
  • LinkRenderer类未对title属性的值进行编码 在渲染链接字段时。 (327905,347361)[1月15日更新, 2014]

然后,自Sitecore CMS 6.6.0 rev以来,它已得到改进。 130404(又名Update-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 rev开始。 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>
  

您可以与支持人员联系,他们了解问题和   有一个修复程序可用。你应该要求Sitecore.Support.381846.dll

Sitecore.Support.381846程序集修改了 GetTextFieldValue 处理程序,其中遗漏了以下代码行。

args.Result.FirstPart = HttpUtility.HtmlEncode(args.Result.FirstPart);

此“修复”只会为单行文字字段带来旧行为。换句话说,它引用了旧的问题,参考编号为#327905(详见上文)。

为什么在升级到Sitecore CMS 6.6 Update-3及更高版本后,我的Sitecore解决方案中的所有内容都被破坏了?因为您错误地使用单行文本字段。此字段类型不会存储HTML或JavaScript。这是用于存储内容值的内容字段类型。如果您在内容字段中存储HTML标记和JavaScript,则表示您不遵循Sitecore最佳实践。

要点:

  1. 参考编号#381846没有问题 Sitecore CMS中的(Sitecore.Support.381846.dll)。
  2. 实际问题#327905自Sitecore CMS 6.6 Update-3以来一直是地址。
  3. Sitecore HTML编码单行文字链接字段类型。
  4. 不要将HTML和Java Script或任何与演示文稿相关的元数据存储在内容字段中,例如单行文本。否则,内容编辑器很可能会破坏整个内容 如果在单行文字中错误地更改了HTML / JavaScript,则会显示页面 字段。
  5. 内容及其展示必须分开并单独存储。
  6. 我希望这有助于说清楚。

    祝福, 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" />
    

    现在,您可以控制哪些Sitecore字段类型应该是或不应该是HTML编码。

答案 2 :(得分:3)

从Sitecore 6.5升级到7.0时,我们遇到了同样的问题。 FieldRenderer中似乎存在一个错误,导致无法呈现HTML标记。您可以与支持人员联系,他们了解问题并提供修复服务。

你应该要求Sitecore.Support.381846.dll,它需要像这样集成:

在web.config中替换此行

<processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />

有了这个

<processor type="Sitecore.Support.Pipelines.RenderField.GetTextFieldValue, Sitecore.Support.381846" />

希望这有帮助。

答案 3 :(得分:0)

我们遇到了这个问题并发现了这篇文章。我们选择通过直接访问数据库并使用nbsp和amp更新单个文本字段来处理它,这些是我们的主要问题区域,可以为您正在处理的每个编码字符重复这些步骤。我们选择手动处理链接字段。

通过在Master和Web中运行替换,您可以省略重新发布的字段。

此致 扬

SELECT TOP 18000 * FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%&amp;%;%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')    - 和FieldId in(选择ItemId FROM SharedFields,其中Value就像'General Link')

/ *找到所有具有NBSP的单行文本字段 / SELECT替换(值,'',''), FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

/ *在单行文本字段中替换NBSP * / UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'','')where(Value like'%%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'','')where(Value like'%%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

/ *查找所有具有AMP /
的单行文本字段 SELECT替换(值,'&amp;','&amp;'),
FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%&amp;%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

/ *替换单行文本中的放大器字段* /
UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'&amp;','&amp;')where(Value like'%&amp;%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'&amp;','&amp;')where(Value like'%&amp;%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

/ *找到所有单行文本字段,其中包含'' /
SELECT替换(值,''',''''),
FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%'%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

/ *替换''单行文本FIELDS * / UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,''','''')where(Value like'%'%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,''','''')where(Value like'%'%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

/ *查找具有“” /
的所有单行文本字段 SELECT替换(值,'“','”'),
FROM [uat_Sitecore_master_new]。[dbo]。[VersionedFields] where(Value like'%“%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

/ * REPLACE“”单行文字字段* /
UPDATE [uat_Sitecore_master_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'“','”')where(Value like'%“%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')

UPDATE [uat_Sitecore_web_new]。[dbo]。[VersionedFields] SET Value = Replace(Value,'“','”')where(Value like'%“%')   和FieldId(从SharedFields中选择ItemId,其中Value就像'单行文本')