如何以编程方式获取渲染内容?

时间:2013-03-06 22:57:13

标签: c# sitecore sitecore6

我正在尝试编写一个方法,该方法将输出恰好存在于特定占位符中的任何渲染的内容(即HTML)。目标是传入Sitecore.Data.Items.Item和我感兴趣的占位符键,该方法应返回呈现的内容。

这个问题似乎是没有建立页面上下文,因此调用RenderControl()会在Sublayout的GetCacheKey()方法中抛出一个空引用错误。

是否有人知道以编程方式呈现Sublayout或XSLT渲染的方法?

这是我到目前为止所得到的:

private string GetPlaceholderContent(Item item, string placeHolder)
{
    StringWriter sw = new StringWriter();
    using (HtmlTextWriter writer = new HtmlTextWriter(sw))
    {
        foreach (RenderingReference renderingReference in item.Visualization.GetRenderings(Sitecore.Context.Device, false))
        {
            if (renderingReference.Placeholder == placeHolder)
            {
                // This ensures we're only dealing with Sublayouts
                if (renderingReference.RenderingItem.InnerItem.IsOfType(Sitecore.TemplateIDs.Sublayout))
                {
                    var control = renderingReference.GetControl();
                    control.RenderControl(writer); // Throws null reference error in GetCacheKey()
                }
            }
        }
    }

    return sw.ToString();
}

2 个答案:

答案 0 :(得分:1)

在我看来,以编程方式呈现Sublayout的最佳方法是使用转发器,并在<sc:Sublayout>中添加<ItemTemplate>标记。

从那里你只需要做以下一项或两项:

  1. DataSource的{​​{1}}属性设置为所需项目的GUID的字符串表示形式(即子布局的数据源,如果有的话)

  2. <sc:Sublayout>的{​​{1}}属性设置为您要呈现的Sublayout的路径。

  3. 服务器/ sitecore将处理其余部分。

答案 1 :(得分:1)

距离最初提出这个问题已经快 8 年了,现在变成了 Uniform - 渲染任何项目/占位符片段!

是的,它将您提供的项目切割成占位符/渲染:

enter image description here

下一步是生成标记(针对所有可能的数据源):

enter image description here

该内容发布到 CDN 中,浏览器选择要加载的版本 = 个性化有效!

换句话说,您提出的问题变成了一个尖端产品,它可以做更多事情

您可以对 Uniform 程序集进行逆向工程,看看它们实际上是如何做到的 ;)