我有一个富文本字段,其中包含HTML中嵌入图像的特定标记({{alt}}
和{{title}}
)。我扩展了Sitecore.Pipelines.RenderField.GetFieldValue
处理器,以便在前端呈现页面时,处理器将使用媒体项中的alt和title字段值替换这些令牌。不幸的是我的自定义处理器只处理一组特定的项目(特别是WFFM字段),它不会处理具有令牌的Body
字段,即使我知道我正在浏览的页面正在渲染该字段(代码运行)在布局上是@Html.Sitecore().Field("Body")
,这意味着它应该由管道处理,对吗?)
我还尝试了GetTextFieldValue
和GetMemoFieldValue
处理器,但处理了相同的项目。寻找一些指导,具体说明哪些字段应由此管道处理。
这是我的Process()函数:
public void Process(RenderFieldArgs args)
{
Assert.ArgumentNotNull(args, "args");
Assert.ArgumentNotNull(args.Item, "args.Item");
Assert.ArgumentNotNull(args.GetField(), "args.GetField()");
if (args.Item.Database == Database.GetDatabase("web"))
{
if (args.GetField().Value.Contains("{{alt}}"))
{
args.GetField().Value = ReplaceAltToken(args.GetField().Value);
}
if (args.GetField().Value.Contains("{{title}}"))
{
args.GetField().Value = ReplaceTitleToken(args.GetField().Value);
}
if (args.GetField().Name == "Body")
{
// Since we're rendering the body field differently we need to expand dynamic links
args.Item.Editing.BeginEdit();
args.GetField().Value = Sitecore.Links.LinkManager.ExpandDynamicLinks(args.GetField().Value);
args.Item.Editing.EndEdit();
}
}
}
我的配置包含文件:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<renderField>
<processor
type="[Redacted].Processor.RenderField.GetFieldValueExtended, [Redacted].Processor"
patch:after="processor[@type='Sitecore.Pipelines.RenderField.GetFieldValue, Sitecore.Kernel']" />
</renderField>
</pipelines>
</sitecore>
答案 0 :(得分:0)
解决此问题有多个步骤。取消选中所有渲染中的Cacheable
是重要的第一步。我遇到的其他问题很可能是我的解决方案所特有的(设计不合理,很快就会重构)。
我的本地网站没有最新的文件。当我更新文件时,我仍遇到Attempt to retrieve context object of type 'Sitecore.Mvc.Presentation.PageContext' from empty stack
错误,我可以通过在模型中的简单GetBody()函数中调用Sitecore.Web.UI.WebControls.FieldRenderer.Render(item, "Body")
而不是Html.Sitecore().Field("Body")
来解决此问题。然后在视图中我简单地放了@Html.Raw(Model.Body)
。
我认为.Field()
帮助程序不起作用,因为与请求的字段关联的项目未知,因此另一种解决方法是使用Html.Sitecore().Field("Body", item)
直接在参数中指定项目。