【发布时间】:2013-03-06 22:57:12
【问题描述】:
我正在尝试编写一个方法,该方法将为碰巧存在于特定占位符中的任何渲染输出内容(即 HTML)。目标是传入Sitecore.Data.Items.Item 和我感兴趣的占位符键,该方法应返回呈现的内容。
这个问题似乎是没有建立页面上下文,因此调用RenderControl() 会在子布局的GetCacheKey() 方法中引发空引用错误。
有人知道以编程方式呈现子布局或 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();
}
【问题讨论】:
-
您是否在 Sitecore 应用程序中执行此代码?那么您希望有一个上下文还是另一个应用程序,您是否需要一种手动创建上下文的方法?
-
嗯...当然有办法做到这一点...因为在内部这正是 Sitecore 正在做的事情。我建议使用 ILSpy 或 Reflector 进行深入探索。戴上你的探险头盔,然后查看
中的 renderLayout 部分。 -
也许选项是在占位符标记周围添加一些标记并从代码执行对项目的请求,然后修剪响应以仅获取您感兴趣的 html 部分?
-
@RuudvanFalier 它在我的 Sitecore 解决方案中的 ASMX Web 服务中执行。我给出的代码示例包含在
SiteContextSwitcher() -
Item Web API 是呈现单个渲染的功能。也许这是一条值得探索的途径。