2013-03-06 8 views
10

Ich versuche eine Methode zu schreiben, die den Inhalt (d. H. HTML) für alle Renderings ausgeben wird, die in einem bestimmten Platzhalter vorkommen. Das Ziel besteht darin, einen Sitecore.Data.Items.Item und den Platzhalterschlüssel, an dem ich interessiert bin, zu übergeben, und die Methode sollte den gerenderten Inhalt zurückgeben.Wie bekomme ich Inhalt des Renderings programmgesteuert?

Das Problem damit scheint zu sein, dass es keinen Seitenkontext gibt, und daher Aufruf RenderControl() wirft einen Null-Referenzfehler in der GetCacheKey() Methode des Sublayout.

Kennt jemand eine Möglichkeit, ein Sublayout- oder XSLT-Rendering programmgesteuert zu rendern?

Hier ist, was ich bisher habe:

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

Führen Sie diesen Code in einer Sitecore-Anwendung aus? Erwarten Sie also, dass es einen Kontext gibt oder ist es eine andere Anwendung, und Sie benötigen eine Möglichkeit, einen Kontext manuell zu erstellen? –

+0

Nun ... natürlich gibt es einen Weg, es zu tun ... weil intern genau das ist, was Sitecore macht. Ich schlage eine intensive Auseinandersetzung mit ILSpy oder Reflector vor. Setzen Sie Ihren Spelunking-Helm auf und sehen Sie sich dann den Bereich renderLayout in an. – Bryan

+0

Vielleicht wäre die Option, einige Markierungen um das Platzhalter-Markup hinzuzufügen und die Anfrage an das Element aus dem Code auszuführen und dann die Antwort zu kürzen, um nur den Teil des HTML zu erhalten, an dem Sie interessiert sind? –

Antwort

1

Meiner Meinung nach ist der beste Weg, um programmatisch ein Sublayout zu machen ist einen Repeater zu verwenden, und legt einen <sc:Sublayout>-Tag in den <ItemTemplate>.

Von dort nur Sie haben einen oder beide der folgenden Funktionen ausführen:

  1. Stellen Sie die DataSource Eigenschaft des <sc:Sublayout> die String-Darstellung des gewünschten Artikels GUID zu sein (dh die Datenquelle für die sublayout (falls vorhanden)

  2. Legen Sie die Path-Eigenschaft des <sc:Sublayout> als den Pfad zu dem Sublayout fest, das Sie rendern möchten.

Der Server/Sitecore übernimmt den Rest.

+2

Dies fügt ein Unterlayout statisch in Code ein. Derek muss das Steuerelement programmgesteuert in C# rendern und die Antwortausgabekette dieses Steuerelements in C# haben. Er hat keinen Seitenkontext, da er in einem Dienst ist. –

Verwandte Themen