0

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

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

我注意到Sitecore.Layouts命名空间包括ConverterDesignTimeHtmlRuntimeHtml,后者引用了convertToRuntimeHtml管道,它似乎传递了一个 HtmlDocument。这些似乎是与所见即所得编辑器相关的管道。

如果不存在这样的东西,找到页面上的所有控件然后将它们呈现出来会接近 Sitecore 呈现的内容吗?

4

3 回答 3

3

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

于 2012-05-04T13:07:19.227 回答
2

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

从我在快速查看 Reflector 时看到的情况来看,RenderLayoutSitecore 管道将允许您修改流程,因为子布局项与其用户控制对应项链接在一起。然后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

于 2012-05-04T14:10:47.197 回答
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";
        }
    }
}
于 2012-05-04T13:20:48.187 回答