我正在尝试编写一个方法,该方法将输出恰好存在于特定占位符中的任何渲染的内容(即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();
}
答案 0 :(得分:1)
在我看来,以编程方式呈现Sublayout的最佳方法是使用转发器,并在<sc:Sublayout>
中添加<ItemTemplate>
标记。
从那里你只需要做以下一项或两项:
将DataSource
的{{1}}属性设置为所需项目的GUID的字符串表示形式(即子布局的数据源,如果有的话)
将<sc:Sublayout>
的{{1}}属性设置为您要呈现的Sublayout的路径。
服务器/ sitecore将处理其余部分。
答案 1 :(得分:1)
距离最初提出这个问题已经快 8 年了,现在变成了 Uniform - 渲染任何项目/占位符片段!
是的,它将您提供的项目切割成占位符/渲染:
下一步是生成标记(针对所有可能的数据源):
该内容发布到 CDN 中,浏览器选择要加载的版本 = 个性化有效!
换句话说,您提出的问题变成了一个尖端产品,它可以做更多事情!
您可以对 Uniform 程序集进行逆向工程,看看它们实际上是如何做到的 ;)