2013-03-06 15 views
10

Sto tentando di scrivere un metodo che produrrà il contenuto (ad esempio HTML) per tutti i rendering che si verificano all'interno di un segnaposto specifico. L'obiettivo è passare un Sitecore.Data.Items.Item e la chiave segnaposto a cui sono interessato, e il metodo dovrebbe restituire il contenuto visualizzato.Come ottenere il contenuto del rendering a livello di programmazione?

Il problema con questo sembra essere che non è stato stabilito alcun contesto di pagina e pertanto chiamare RenderControl() genera un errore di riferimento null nel metodo GetCacheKey() del Sottotesto.

Qualcuno è a conoscenza di un modo per visualizzare a livello di codice un rendering Sottotesto o XSLT?

Ecco quello che ho finora:

private string GetPlaceholderContent(Item item, string placeHolder) 
{ 
    StringWriter sw = new StringWriter(); 
    using (HtmlTextWriter writer = new HtmlTextWriter(sw)) 
    { 
     foreach (RenderingReference renderingReference in item.Visualization.GetRenderings(Sitecore.Context.Device, false)) 
     { 
      if (renderingReference.Placeholder == placeHolder) 
      { 
       // This ensures we're only dealing with Sublayouts 
       if (renderingReference.RenderingItem.InnerItem.IsOfType(Sitecore.TemplateIDs.Sublayout)) 
       { 
        var control = renderingReference.GetControl(); 
        control.RenderControl(writer); // Throws null reference error in GetCacheKey() 
       } 
      } 
     } 
    } 

    return sw.ToString(); 
} 
+0

Stai eseguendo questo codice all'interno di un'applicazione Sitecore? Quindi ti aspetti che ci sia un contesto o un'altra applicazione in comune e hai bisogno di un modo per creare manualmente un contesto? –

+0

Beh ... certo che c'è un modo per farlo ... perché internamente questo è esattamente ciò che sta facendo Sitecore. Suggerisco qualche esplorazione intensiva con ILSpy o Reflector. Metti il ​​tuo elmetto spelunking e poi controlla la sezione renderLayout in . – Bryan

+0

Forse l'opzione sarebbe aggiungere alcuni marcatori attorno al markup del segnaposto ed eseguire la richiesta all'elemento dal codice e quindi tagliare la risposta per ottenere solo la parte dell'html a cui sei interessato? –

risposta

1

A mio parere, il modo migliore per rendere a livello di codice un Sublayout è quello di utilizzare un ripetitore, e mettere un tag <sc:Sublayout> nel <ItemTemplate>.

Da lì devi solo effettuare una o entrambe delle seguenti operazioni:

  1. Impostare la proprietà DataSource del <sc:Sublayout> di essere la rappresentazione di stringa del GUID della voce desiderata (ad esempio l'origine dati per la sublayout , se esistente)

  2. Impostare la proprietàdi <sc:Sublayout> come percorso del Sottotitolo che si desidera eseguire il rendering.

Il server/sitecore gestirà il resto.

+2

Questo sta inserendo staticamente un sottotesto nel codice. Derek ha bisogno di eseguire il rendering in modo programmatico del controllo in C# e di avere la stringa di output di risposta di quel controllo in C#. Non ha un contesto di pagina come è in un servizio. –

Problemi correlati