【问题标题】:How to get content of rendering programmatically?如何以编程方式获取渲染内容?
【发布时间】: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 是呈现单个渲染的功能。也许这是一条值得探索的途径。

标签: c# sitecore sitecore6


【解决方案1】:

自最初提出问题以来已经将近 8 年了,现在变成了 Uniform - 渲染任何项目/占位符片段!

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

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

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

换句话说,您提出的问题变成了一种尖端产品,在此之上可以做得更多

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

【讨论】:

    【解决方案2】:

    在我看来,以编程方式呈现子布局的最佳方式是使用转发器,并在<ItemTemplate> 中放置一个<sc:Sublayout> 标记。

    从那里您只需执行以下一项或两项操作:

    1. <sc:Sublayout>DataSource 属性设置为所需项的GUID(即子布局的数据源,如果有)的字符串表示形式

    2. <sc:Sublayout>Path 属性设置为要渲染的子布局的路径。

    服务器/站点核心将处理其余部分。

    【讨论】:

    • 这是在代码中静态插入子布局。 Derek 需要以编程方式在 C# 中呈现控件,并在 C# 中具有该控件的响应输出字符串。他在服务中时没有页面上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多