目前,我希望在主要“内容”部分之外创建一个页面层次结构,以使其与其他部分分开,并将其与所有其他跨站点数据保持一致。我可以按照我想要的方式分配布局,子布局和内容。
然而,我需要将内容作为XHTML(目前非常简单的XHTML)来推动它通过iTextSharp& Html整洁或等效。是否有我可以挂钩的管道或事件,以便我可以获得大部分页面或所有页面响应?
我注意到Sitecore.Layouts
命名空间包含Converter
,DesignTimeHtml
和RuntimeHtml
,后者引用convertToRuntimeHtml
管道,似乎传递一个HtmlDocument。这些似乎是与WYSIWYG编辑器有关的管道。
如果不存在,那么找到页面上的所有控件然后将它们渲染出来会接近Sitecore会渲染的内容吗?
答案 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