5

使用 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 页面上放置一个标签,它会很好地呈现。

4

1 回答 1

7

我想我以前见过这个(解决方案的全部功劳归于 Neil Gibbons 和 Hoang Chu)。

问题是由 Tridion.ContentDelivery DLL 中的 ComponentPresentation 服务器控件引起的,尤其是该控件在其 Render 方法期间加载到 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 的人给我点头,那么我可以添加它。)

于 2013-02-01T15:15:00.590 回答