5

SDL Tridion 2011 SP1 を使用して動的コンポーネント プレゼンテーションを発行する場合、出力形式として主に REL を使用しますが、ASP.NET コントロール タグを含む DCP を発行したいと考えています。したがって、テンプレートの出力形式を ASCX に変更し、Web アプリケーション内のファイル システムに移動するように ASCX コンポーネント プレゼンテーションのストレージを構成しました。ディスク上に ascx ファイルが表示され、予想どおり、内部にコントロール タグが表示されます。

同じコントロール タグを含む aspx ページを作成すると、期待どおりの出力が得られますが、ASCX コンポーネント プレゼンテーションがコンポーネント プレゼンテーション アセンブラーによって実行されると、コントロール タグからの出力がレンダリングされるのではなく、空白になります。DCP 内のプレーン テキストは表示されます。

私が必要としている機能は、Tridion 動的コンポーネント リンク コントロールと非常によく似ており、このアーキテクチャでこれらの 1 つを既に試し、成功しました。タグとトリディオンの両方を 1 つずつテンプレートに入れるところまで行きました。この場合、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 によって実行されると、最初のコントロールは期待される出力を生成しますが、2 番目のコントロールは生成しません。<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 フォーラムでは、ライフ サイクルの早い段階で組み込みコントロールを実行するために標準のコンテンツ配信ユーザー コントロールをオーバーライドすることを含むソリューションが提案されています: https://forum.tridion.com/topic.asp?TOPIC_ID =5709&whichpage=3&SearchTerms=Page_Load (フォーラムからコードをコピーしてここに追加することの合法性についてはよくわかりません。Tridion の誰かが私に同意してくれたら、追加できます。)

于 2013-02-01T15:15:00.590 に答える