使用SDL Tridion 2011 SP1发布动态组件演示文稿时,我主要使用REL作为输出格式,但我现在想要发布包含ASP.NET控件标记的DCP。因此,我将模板的输出格式更改为ASCX,并将ASCX组件演示文稿的存储配置为转到我的Web应用程序中的文件系统。我可以在磁盘上看到ascx文件,正如预期的那样,我可以在里面看到控制标签。
如果我创建一个包含相同控件标签的aspx页面,输出就像我期望的那样,当组件演示汇编器执行ASCX组件演示时,而不是从控件标签渲染输出,它来了空白。 DCP中的纯文本确实显示出来。
我需要的功能与Tridion动态组件链接控件非常相似,我已经使用这种架构尝试了其中一种,并且成功了。我甚至把我的标签和tridion一个接一个地放在模板中。在这种情况下,我看到tridion标签的输出,但不是来自我自己的输出,即使引用是在同一个web.config中连接的。
所以我可以看到,Tridion的组件表示汇编程序可以执行ASCX DCP并成功呈现其子控件。在创作这样的控件时是否有要求确保它可以以这种方式呈现?
更新:
DCP发布到我网站中的ascx文件。出于测试目的,我现在在同一个DCP中发布tridion控件,因此磁盘上的输出如下所示:
<tridion:DynamicComponentLink PageURI="tcm:34-667-64" ComponentURI="tcm:34-876"
TemplateURI="tcm:34-864-32" LinkText="Some page" runat="server" />
<xxx:ComponentLinkQS runat="server" ComponentUri="tcm:34-945"
QueryString="item=876" Text="Some page" />
当DCP像这样发布并由ComponentPresentationAssembler执行时,第一个控件产生预期的输出,而第二个控件产生预期的输出。如果我将<xxx:ComponentLinkQS/>
标记直接放在ASPX页面上,它会呈现正常。
答案 0 :(得分:7)
我认为我之前已经看过这个问题(解决方案的全部功劳归功于Neil Gibbons和Hoang Chu)。
问题是由Tridion.ContentDelivery DLL中的ComponentPresentation服务器控件引起的,特别是在它的渲染方法期间此控件在DCP用户控件中加载的方式:
protected override void Render(HtmlTextWriter writer)
{
if (HttpContext.Current != null && HttpContext.Current.Application != null)
{
ComponentPresentationAssembler componentPresentationAssembler = new ComponentPresentationAssembler(this.pageUri, base.Page);
writer.Write(componentPresentationAssembler.GetContent(this.componentUri, this.templateUri));
base.RenderChildren(writer);
}
}
Render方法在控件生命周期中为时已晚,任何其他控件都无法连接其事件 - 因此我的用户控件Page_load永远不会被触发。
在下面的链接上的Tridion论坛上提出了一个解决方案,其中涉及覆盖标准的Content Delivery用户控件,以便在生命周期的早期执行嵌入式控件:https://forum.tridion.com/topic.asp?TOPIC_ID=5709&whichpage=3&SearchTerms=Page_Load (我不确定从论坛复制代码并在此处添加代码的合法性。如果来自Tridion的人给我点头,那么我可以添加它。)