2013-02-01 9 views
5

Beim Veröffentlichen dynamischer Komponentenpräsentationen mit SDL Tridion 2011 SP1 verwende ich hauptsächlich REL als Ausgabeformat, möchte jedoch jetzt ein DCP veröffentlichen, das ein ASP.NET-Steuerelement-Tag enthält. Daher habe ich das Ausgabeformat der Vorlage in ASCX geändert und den Speicher für ASCX-Komponentenpräsentationen so konfiguriert, dass das Dateisystem in meiner Webanwendung angezeigt wird. Ich kann die Ascx-Dateien auf der Festplatte sehen, und wie erwartet, kann ich das Steuerelement-Tag darin sehen.Tridion ASCX DCP rendert keine Kindsteuerung

Wenn ich eine Aspx-Seite erstellen, die die gleiche Steuerelement-Tag enthält, ist die Ausgabe wie erwartet, aber wenn die ASCX-Komponente Präsentation von der Komponente Präsentation Assembler ausgeführt wird, anstatt die Ausgabe von der Steuerelement-Tag kommt leer. Klartext in der DCP wird angezeigt.

Die Funktionalität, die ich brauche, ist sehr ähnlich zu einer Tridion Dynamic Component Link-Steuerung, und ich hatte bereits eine dieser mit dieser Architektur versucht, und war erfolgreich. Ich bin sogar soweit gegangen, sowohl mein Tag als auch den Tridion nacheinander in die Vorlage zu legen. In diesem Fall sehe ich die Ausgabe aus dem tridion-Tag, aber nicht aus meinem eigenen, obwohl die Referenzen in derselben web.config verdrahtet sind.

So kann ich sehen, dass es möglich ist, haben Tridion Komponente Präsentation Assembler ein ASCX DCP ausführen und erfolgreich untergeordneten Steuerelemente rendern. Gibt es vielleicht Anforderungen, wenn ein solches Steuerelement erstellt wird, um sicherzustellen, dass es auf diese Weise gerendert werden kann?

UPDATE:

Das DCP auf eine ascx Datei innerhalb meiner Website veröffentlicht wird. Für Testzwecke bin Veröffentlichung ich jetzt die tridion Kontrolle in der gleichen DCP, so dass der Ausgang auf der Festplatte wie folgt aussieht:

<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" /> 

Wenn das DCP wie diese veröffentlicht wird, und ausgeführt von der ComponentPresentationAssembler die erste Steuer erzeugt die erwartete Ausgabe, und die zweite nicht. Wenn ich ein <xxx:ComponentLinkQS/>-Tag direkt auf einer ASPX-Seite platziere, wird es gerendert.

+0

Haben Sie versucht, eine einfache "Hallo Welt" Kontrolle zu schreiben, um zu sehen, ob es einige Probleme mit Ihrem geben könnte neues Linking-Steuerelement wird ausgeführt, ohne direkt auf einer Seite zu sein? –

+0

Sind die ASCX-DCPs in der Webanwendung gespeichert? – Quirijn

Antwort

7

Ich denke, dass ich das schon einmal gesehen habe (volle Anerkennung für die Lösung geht an Neil Gibbons und Hoang Chu).

Das Problem wird durch die ComponentPresentation Server Sonde in Tridion.ContentDelivery DLL und insbesondere die Art und Weise diese Steuerlasten in der DCP-Benutzersteuerung verursacht wird, während es Render-Methode:

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); 
    } 
} 

Die Render-Methode ist zu spät im Steuerungslebenszyklus für alle anderen Steuerelemente, deren Ereignisse verkabelt werden sollen - daher wird mein Benutzer kontrolliert, dass "Laden" niemals ausgelöst wird.

Es gibt eine Lösung für diese auf den Tridion-Foren auf dem Link unterhalb dem beinhaltet das Überschreiben des Standard-Content-Delivery-Benutzer vorgeschlagen steuert Ihre eingebetteten Kontrollen früher im Lebenszyklus auszuführen: https://forum.tridion.com/topic.asp?TOPIC_ID=5709&whichpage=3&SearchTerms=Page_Load (Ich bin nicht sicher über die Legalitäten Code aus den Foren kopieren und hier hinzufügen Wenn jemand von Tridion mir das Nicken gibt dann kann ich es hinzufügen.)

+0

Hallo Jonathon, Danke für den Zeiger (Hoang ist ein ehemaliger Kollege und ein Ass-Hacker!) Leider ist seine Lösung für ein anderes Problem. Ich denke, es hängt mit dem Kontroll-Lebenszyklus zusammen. Soweit ich weiß, lädt der ComponentPresentationAssembler die ASCX von der Festplatte und rendert sie dann.Sollte das für die Kindersteuerung funktionieren, oder müssen sie auch explizit verdrahtet sein? Sie sehen von meinem Update auf die Frage, dass ein Tridion-Steuerelement auf die gleiche Weise funktioniert. Ich wünschte, ich wüsste, was anders ist. –