【问题标题】:Tridion ASCX DCP does not render child controlTridion ASCX DCP 不呈现子控件
【发布时间】:2013-01-16 20:58:42
【问题描述】:

使用 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 执行时,第一个控件会产生预期的输出,而第二个不会。如果我将 &lt;xxx:ComponentLinkQS/&gt; 标记直接放在 ASPX 页面上,它会很好地呈现。

【问题讨论】:

  • 您是否尝试过编写一个简单的“hello world”控件,以查看在不直接在页面上执行新链接控件时是否存在一些问题?
  • ASCX DCP 是否存储在 Web 应用程序中?

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


【解决方案1】:

我想我以前见过这个(解决方案的全部功劳归于 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 的某个人给我点头,那么我可以添加它。)

【讨论】:

  • 您好 Jonathon,感谢您的指点(Hoang 是前同事,也是一名 ace 黑客!)不幸的是,他的解决方案是针对不同的问题。我认为这与控制生命周期有关。据我所知,ComponentPresentationAssembler 从磁盘加载 ASCX,然后渲染它。这应该适用于子控件,还是也必须明确连接?您将从我的更新中看到 Tridion 控件以相同的方式执行的问题。我希望我知道有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多