首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >细胞质雄性不育6.5与7.0的FieldRenderer产量差异

细胞质雄性不育6.5与7.0的FieldRenderer产量差异
EN

Stack Overflow用户
提问于 2014-01-10 16:05:26
回答 4查看 5.8K关注 0票数 8

最近,我一直在将内容和代码从一个旧的Sitecore 6.5安装(有相当多的定制)转移到一个干净的CMS 7.0安装。

在原始站点中,使用Single-line text字段将任意Javascript呈现到页面中(用于跟踪)。这很好,Javascript被呈现到页面中,未编码并按预期执行。

然而,在新的安装中,我注意到内容现在是HTML编码的,这意味着它不会在我正在使用的Sitecore 7安装下执行。

在我的Sublayout中,我有这样一个FieldRenderer:

代码语言:javascript
运行
复制
<sc:FieldRenderer ID="tracker" FieldName="Script" runat="server" />

我不确定是否有一个定制/配置,我还没有迁移过,或者这是一个改变,已经引入了Sitecore 7(可能是出于安全的原因)。

有人能解释一下这件事吗?我是否需要创建自己的字段类型以允许所需的行为,还是有一种方法可以通过“开箱即用”字段类型来实现?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-12 17:56:51

我检查了Sitecore 6.5和7中的GetTextFieldValue处理器类,看起来不一样

这是来自塞特科雷6.5 : Sitecore.Pipelines.RenderField.GetTextFieldValue的

代码语言:javascript
运行
复制
 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");
    }

这一张来自塞特科雷7: Sitecore.Pipelines.RenderField.GetTextFieldValue

代码语言:javascript
运行
复制
 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);
}

您可以在最后一行代码上看到Process方法,从Sitecore 7结果被编码。您可以为GetTextField处理器创建自己的类,并将其添加到RenderField管道中,但我建议您将字段从单行文本更改为多行文本或备忘字段。

我检查了Sitecore 6.5和7上的Sitecore.Pipelines.RenderField.GetMemoFieldValue类,实现是相同的,结果没有编码:

代码语言:javascript
运行
复制
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更新3上更新的,您可以在释放历史上看到:

页编辑器在6.6更新-3,管道被修改为HTML编码字段值时,呈现单行文本字段(参考。第327905号)。在显示编码值的“页编辑器”中,此操作不正确。如果用户保存了页面,那么已经编码的值将再次被HTML编码。(384997)

希望能帮上忙。

票数 10
EN

Stack Overflow用户

发布于 2014-05-06 23:24:42

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

在FieldRenderer中似乎存在一个错误,它阻止呈现HTML标记,而Sitecore没有HTML。

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

根据Sitecore的发行说明,这个问题已经在131111修订版(又名更新-3)之后得到了解决。

布局和渲染

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

然后,它得到了改进,自从Sitecore 6.6.0Rev.130404(又名更新-5)。

布局和渲染

  • 在6.6更新-3中,在呈现链接字段时,管道被修改为HTML编码字段值(ref )。第327905号)。这最终产生了意想不到的副作用,例如在链接字段中嵌入IMG时。因此,链接字段的字段值不再在6.6 Update-5及更高版本中编码.(382059)

自从CMS 6.6.0版本130529 (又名Service Pack-1)以来

页编辑器

  • 在6.6更新-3中,在呈现单行文本字段时,管道被修改为HTML编码字段值(ref )。第327905号)。在显示编码值的“页编辑器”中,此操作不正确。如果用户保存了页面,那么已经编码的值将再次被HTML编码。(384997)

从版本6.6Rev.131111(6.6Update-3)开始,使用HttpUtility.HtmlEncode方法对单行文本字段和链接字段的值进行编码。

这些更改已经在GetTextValue处理器以及Sitecore.Xml.Xsl.LinkRenderer类中引入。

代码语言:javascript
运行
复制
<renderField>
  ...
  <processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />
  ...
</renderField>

您可以联系支持,他们知道问题,并有一个修复可用。你应该向塞托雷求援。

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

代码语言:javascript
运行
复制
args.Result.FirstPart = HttpUtility.HtmlEncode(args.Result.FirstPart);

这个“修正”只带来了单行文本字段的旧行为。换句话说,它介绍了编号#327905的老问题(详见上文)。

为什么在升级到SECOREMS6.6更新-3及更高版本后,我的Sitecore解决方案中的所有内容都被破坏了?因为您不正确地使用单行文本字段。此字段类型不应该存储HTML或JavaScript。这是要存储内容值的内容字段类型。如果您将HTML和JavaScript存储在内容字段中,这意味着您没有遵循Sitecore最佳实践。

摘要:

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

我希望这有助于澄清这一点。

最良好的祝愿,奥列格·博罗夫

更新-1:

Sitecore和DMS7.2Rev.141226(又名7.2Update-3)在Web.config文件中引入了Web.config设置,该设置指定了由<renderField>管道呈现时应该编码的字段类型的管道分隔列表。

代码语言:javascript
运行
复制
<!--  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编码的,或者不应该编码的。

票数 6
EN

Stack Overflow用户

发布于 2014-01-13 01:33:04

当我们从Sitecore 6.5升级到7.0时,我们也遇到了同样的问题。在FieldRenderer中似乎存在一个错误,它阻止了HTML的呈现。您可以联系支持,他们知道问题,并有一个修复可用。

您应该请求SArchore.Support.381846.dll,它需要像这样的集成:

在web.config中替换这一行

代码语言:javascript
运行
复制
<processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel" />

有了这个

代码语言:javascript
运行
复制
<processor type="Sitecore.Support.Pipelines.RenderField.GetTextFieldValue, Sitecore.Support.381846" />

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21048909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档