拦截Sitecore中页面的渲染HTML /运行时HTML

时间:2012-05-04 12:52:43

标签: c# xhtml sitecore httpresponse

目前,我希望在主要“内容”部分之外创建一个页面层次结构,以使其与其他部分分开,并将其与所有其他跨站点数据保持一致。我可以按照我想要的方式分配布局,子布局和内容。

然而,我需要将内容作为XHTML(目前非常简单的XHTML)来推动它通过iTextSharp& Html整洁或等效。是否有我可以挂钩的管道或事件,以便我可以获得大部分页面或所有页面响应?

我注意到Sitecore.Layouts命名空间包含ConverterDesignTimeHtmlRuntimeHtml,后者引用convertToRuntimeHtml管道,似乎传递一个HtmlDocument。这些似乎是与WYSIWYG编辑器有关的管道。

如果不存在,那么找到页面上的所有控件然后将它们渲染出来会接近Sitecore会渲染的内容吗?

3 个答案:

答案 0 :(得分:3)

您可以在renderLayout管道中添加自定义处理器。我建议你真的只为各种管道创建一个处理器,看看你能为它们访问什么。一种简单的方法是对Sitecore.kernel.dll进行反编译,并查看kernel\Sitecore.Pipelines.{the pipeline name here}\{the pipeline name here}Args.cs中每个管道的管道args对象。一旦调查了每个管道的args对象,就可以帮助您了解哪个args对象可以访问C#中所需的内容。从那里,您可以测试该管道中的实现。

答案 1 :(得分:1)

我最近这样做了,发现<convertToRuntimeHtml>管道对我不起作用。相反,我已将我的处理器添加到<renderField>管道,该管道至少适用于sc:fld功能(因此也适用于<sc:text>标签)。

这是我处理器的代码:

public class ContentVariablesProcessor
{
    public void Process(Sitecore.Pipelines.RenderField.RenderFieldArgs args)
    {
        if (args != null)
        {
            // Manipulate output
            args.Result.FirstPart = "my output";
        }
    }
}

答案 2 :(得分:1)

我不确定您是否会在Sitecore管道中拥有所需的低级访问权限来访问System.Web.UI.Control的呈现HTML输出,这最终是子布局归结为的。我几乎肯定没有Sitecore管道可以拥有整个渲染页面。

从我在快速查看Reflector时看到的内容,RenderLayout Sitecore管道将允许您修改流程,因为Sublayout Item与其用户控件对应项链接。然后将RenderingReference添加到Sitecore.Context.PageContext。然后Sitecore.Web.UI.WebControls.Placeholder负责获取所有RenderingReferences并调用System.Web.UI.Control.RenderControl()`方法。

由于Sitecore在所有子布局上调用System.Web.UI.Control.RenderControl()并基本上将输出抛给浏览器,而不通过管道推送呈现的HTML,您可能需要查看非Sitecore解决方案。

您可以覆盖用户控件上的所有Render(HtmlTextWriter writer)方法,但这是很多重复编码(除非您有一个基本控件?)。您最好的选择可能是在生成整个页面并即将转到客户端之后使用ASP.NET HttpModule进行格式化。这是一个例子 - http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx