将NVelocity与Sitecore FieldRenderer一起使用

时间:2014-04-28 19:51:43

标签: c# asp.net sitecore nvelocity

我的网页上有一个FieldRenderer控件,该控件绑定到Sitecore项目。

fieldRenderer.Item = SomeSitecoreItem;
fieldRenderer.FieldName = "SomeField";

现在,SomeSitecoreItem中的SomeField具有NVelocity令牌。如何让fieldRenderer呈现那些NVelocity令牌。

例如,SomeField的内容可能是以下标记:

<h1>$!SomeToken</h1>

有没有办法渲染$!SomeToken被代码后面的相应值替换?

1 个答案:

答案 0 :(得分:3)

您可以在renderField管道中添加一个步骤:

<renderField>
  <processor type="Sitecore.Pipelines.RenderField.SetParameters, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetTextFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.ExpandLinks, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetImageFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetLinkFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetInternalLinkFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetMemoFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetDateFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.GetDocxFieldValue, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.AddBeforeAndAfterValues, Sitecore.Kernel"/>
  <processor type="Sitecore.Pipelines.RenderField.RenderWebEditing, Sitecore.Kernel"/>
  <processor type="MyProject.ExpandNVelocityTokens, MyProject"/>
</renderField>

代码可能如下所示:

public class ExpandNVelocityTokens
{
    public virtual void Process(RenderFieldArgs args)
    {
        if (!ShouldRun())
            return;


        if (!Sitecore.Context.PageMode.IsPageEditorEditing)
        {
            args.Result.FirstPart = ExpandVelocityTokens(args.Result.FirstPart);
            args.Result.LastPart = ExpandVelocityTokens(args.Result.LastPart);
        }
    }

    protected bool ShouldRun()
    {
        // In the cheapest possible way - determine if we need to do anything
    }


    protected string ExpandVelocityTokens(string input)
    {
        //... do velocity stuff here
    }
}

注意:此管道是针对每个渲染的字段运行的,因此它非常快,因此它是最重要的 - 因此,ShouldRun方法可以提前爆发。除非你必须这样做,否则不要做任何昂贵的事情。