Sitecore Field Renderer - 在渲染中添加标记

时间:2012-03-09 14:27:18

标签: sitecore

作为SEO增强项目的一部分,我的任务是在标记中为字段渲染器在页面上生成的图像添加以下属性:

itemprop="contentURL" - 在结束标记之前。

<sc:FieldRenderer ID='FieldRenderer_MainImage' Runat='server' FieldName='Homepage Image'
    CssClass="_image" Parameters="w=150" itemprop="contentURL" />

当我尝试将其放置在Field Renderer中,或将其添加为“参数”时 - 它不起作用。

有没有其他方法可以做到这一点,而无需创建控制文件并在代码隐藏中生成输出?

6 个答案:

答案 0 :(得分:6)

您需要使用“参数”属性在和控件上设置额外属性。

你可以这样:

<sc:FieldRenderer ID="PageImage" runat="server" FieldName="ContentImage" Parameters="ControlType=C4Image&rel=relString" />
<sc:Image ID="SCPageImage" runat="server" Field="ContentImage" Parameters="ControlType=C4Image&rel=relString" />

这将呈现如下:

<img width="1232" height="637" controltype="C4Image" rel="relString" alt="" src="~/media/Images/DEMO backgrounds/background2.ashx">

注意:这适用于6.5和6.6 - 不确定在这个问题中使用的是哪个版本。

答案 1 :(得分:3)

通过扩展RenderField管道无法做到这一点?您可以使用GetImageFieldValue反编译(使用Reflector或ILSpy)并添加自己的逻辑来调整ImageRenderer的输出?

参考Sitecore.Pipelines.RenderField.GetImageFieldValue

答案 2 :(得分:2)

如果“参数”不起作用或尝试创建自定义控件,而不是将控件包装在这样的分类div中:

<div class="my-class">
     <sc:FieldRenderer runat="server" />
</div>

您可以使用:

<sc:FieldRenderer Before="<div class='my-class'>" After="</div>" runat="server" />

请注意上面div的类声明中的单引号

这使得它更加清晰,并且在Sitecore控件的上下文中,而不是Web Developer添加一个外部div,如果发生更改,它可能会在以后丢失其上下文。

我建议你自己省一些麻烦并使用现在的Sitecore的MVC版本(当开始新的Sitecore项目时),因为你可以非常简单地添加一个类,如下所示: How can I get Sitecore Field Renderer to use a css class for an image

答案 3 :(得分:1)

您实际上无法在FieldRenderer上执行此操作。你的选择是:

  1. 以能够执行此操作的方式扩展FieldRenderer(这可能需要付出高昂的努力)。
  2. 使用常规.NET控件并通过C#代码隐藏来捆绑Sitecore项目中的数据。

答案 4 :(得分:0)

您可能想尝试使用<sc:image />标记。 如果在那里添加自定义参数,则会将其作为属性添加到img标记中。

在您的情况下,标签将如下所示:

<sc:image runat="server" field="Homepage Image" width="150" itemprop="contentURL" class="_image" />

答案 5 :(得分:0)

使用mvc,我发现这比扩展FieldRender更容易,应该是可重用的,但是必须再测试一下。 WIP。

var image = "<span class=\"rightImage\">" + FieldRenderer.Render(contentBlock, "Image", "mw=300") + "</span>";
            var text = FieldRenderer.Render(contentBlock, "Text");
            model.Text = FieldRendererHelper.InjectIntoRenderer(text, image, "<p>");

  public static HtmlString InjectIntoRenderer(string parentField, string injectField, string injectTag)
    {
        return new HtmlString(parentField.Insert(parentField.IndexOf(injectTag, StringComparison.InvariantCulture) + injectTag.Length, injectField));
    }