gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:12:02 25 4
gpt4 key购买 nike

我最近一直在将内容和代码库从旧的 Sitecore CMS 6.5 安装(具有相当多的自定义设置)转移到全新安装的 CMS 7.0。

在原始站点中,单行文本 字段已用于将任意 Javascript 呈现到页面中(用于跟踪)。这工作正常,Javascript 被呈现到页面中,未编码并按预期执行。

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

在我的子布局中,我有一个像这样的 FieldRenderer:

<sc:FieldRenderer ID="tracker" FieldName="Script" runat="server" />

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

任何人都可以阐明这一点吗?我是否需要创建自己的字段类型以允许所需的行为,或者我是否可以使用“开箱即用”的字段类型来做到这一点?

最佳答案

我检查了 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 管道,但我建议您将字段从 Single Line Text 更改为 Multi Line Text 或 Memo Field 。

我检查了 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 上查看:

Page Editor In 6.6 Update-3, the pipeline was modified to HTML encode the field value when rendering single-line text fields (ref. no. 327905). This did not work correctly in the Page Editor which displayed the encoded value. And if the user saved the page, the already encoded value would be HTML encoded again. (384997)

希望对你有帮助。

关于c# - CMS 6.5 和 7.0 之间的 Sitecore FieldRenderer 输出差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21048909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com