2013-02-01 19 views
5

Durante la pubblicazione di presentazioni di componenti dinamici utilizzando SDL Tridion 2011 SP1, utilizzo principalmente REL come formato di output, tuttavia ora desidero pubblicare un DCP contenente un tag di controllo ASP.NET. Ho quindi modificato il formato di output del modello in ASCX e configurato la memoria per le presentazioni dei componenti ASCX per andare al file system all'interno della mia applicazione web. Posso vedere i file ascx sul disco e, come previsto, posso vedere il tag di controllo all'interno.Tridion ASCX DCP non esegue il rendering del controllo figlio

Se creo una pagina aspx che contiene lo stesso tag di controllo, l'output è come mi aspetto, tuttavia, quando la presentazione del componente ASCX viene eseguita dall'assemblatore di presentazione del componente, invece di rendere l'output dal tag di controllo, esce vuoto Viene visualizzato il testo normale all'interno del DCP.

La funzionalità di cui ho bisogno è molto simile a un controllo di collegamento Tridion Dynamic Component, e avevo già provato uno di questi con questa architettura, e ci sono riuscito. Sono persino arrivato a inserire sia il mio tag che il tridion uno dopo l'altro nel modello. In questo caso vedo l'output dal tag tridion, ma non dal mio, anche se i riferimenti sono cablati nello stesso web.config.

Quindi posso vedere che è possibile che l'assemblatore di presentazione dei componenti di Tridion esegua un DCP ASCX e che esegua correttamente i controlli figlio. Ci sono forse dei requisiti quando si crea un tale controllo per garantire che possa essere reso in questo modo?

UPDATE:

Il DCP è pubblicato in un file ascx all'interno del mio sito. Per scopi di test, ora sto pubblicando il controllo Tridion nella stessa DCP, così l'output su disco appare così:

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

Quando il DCP è pubblicato in questo modo, ed eseguito dal ComponentPresentationAssembler il primo controllo produce la output atteso, e il secondo no. Se inserisco un tag <xxx:ComponentLinkQS/> direttamente su una pagina ASPX, viene visualizzato correttamente.

+0

Hai provato a scrivere un semplice controllo "ciao mondo" per vedere se potrebbero esserci dei problemi con il tuo nuovo controllo di collegamento in esecuzione senza essere direttamente su una pagina? –

+0

Gli archivi DCP ASCX sono memorizzati all'interno dell'applicazione Web? – Quirijn

risposta

7

Penso di averlo già visto prima (credito completo per la soluzione va a Neil Gibbons e Hoang Chu).

Il problema è causato dal controllo server ComponentPresentation all'interno del Tridion.ContentDelivery DLL ed in particolare il modo in cui questo carichi di controllo nel controllo utente DCP durante il suo metodo Render:

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

Il metodo Render è troppo tardi nel ciclo di vita del controllo per tutti gli altri controlli per far sì che i loro eventi siano cablati - quindi il mio utente controlla Page_load non viene mai attivato.

C'è una soluzione proposta per questo sui forum Tridion sul link sottostante che coinvolge l'override l'utente Content Delivery standard di controlli per eseguire i controlli incorporati in precedenza nel ciclo di vita: https://forum.tridion.com/topic.asp?TOPIC_ID=5709&whichpage=3&SearchTerms=Page_Load (non sono sicuro circa la legalità di copiando il codice dai forum e aggiungendolo qui. Se qualcuno di Tridion mi dà il cenno, posso aggiungerlo.)

+0

Ciao Jonathon, Grazie per il puntatore (Hoang è un ex collega e un hacker asso!) Sfortunatamente, la sua soluzione è per un altro problema. Penso che sia legato al ciclo di vita del controllo. Per quanto ne so, ComponentPresentationAssembler carica l'ASCX dal disco e quindi lo esegue il rendering.Dovrebbe quel lavoro per il bambino controllare, o devono essere anche cablati in modo esplicito? Vedrai dal mio aggiornamento alla domanda che un controllo Tridion eseguito nello stesso modo funziona. Vorrei sapere cosa fosse diverso. –

Problemi correlati