Tridion ASCX DCP不呈现子控件

时间:2013-02-01 14:10:32

标签: tridion tridion-2011 tridion-content-delivery

使用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页面上,它会呈现正常。

1 个答案:

答案 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的人给我点头,那么我可以添加它。)