2013-03-06 11 views
10

Próbuję napisać metodę, która wyświetli zawartość (np. HTML) dla wszelkich renderowań, które zdarzają się w określonym miejscu. Celem jest przekazanie Sitecore.Data.Items.Item i klucza zastępczego, który mnie interesuje, a metoda powinna zwrócić renderowaną treść.Jak programowo uzyskać zawartość renderowania?

Problem z tym wydaje się, że nie ustanowiono kontekst strony, a zatem wywołanie RenderControl() rzuca zerowy błąd odniesienia w metodzie Sublayout GetCacheKey().

Czy ktoś jest świadomy sposobu renderowania programu Sublayout lub XSLT programowo?

Oto co mam do tej pory:

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

Czy wykonujesz ten kod w aplikacji Sitecore? Czy spodziewasz się, że będzie kontekst lub czy jest to inna aplikacja i czy potrzebujesz sposobu na ręczne utworzenie kontekstu? –

+0

No cóż ... oczywiście jest sposób na zrobienie tego ... ponieważ wewnętrznie to właśnie robi Sitecore. Proponuję intensywną eksplorację za pomocą ILSpy lub Reflectora. Załóż kask ochronny, a następnie sprawdź sekcję renderLayout pod numerem . – Bryan

+0

Być może opcja polegałaby na dodaniu znaczników wokół znaków zastępczych i wysłaniu żądania do elementu z kodu, a następnie przycięciu odpowiedzi, aby uzyskać tylko część interesującego Cię html? –

Odpowiedz

1

Moim zdaniem, najlepszym sposobem programowo renderowania Sublayout jest zastosowanie repeatera i umieścić <sc:Sublayout> tag w <ItemTemplate>.

Stamtąd trzeba tylko zrobić jedną lub obie z następujących czynności:

  1. Ustaw właściwość <sc:Sublayout>DataSource być reprezentacja ciąg GUID żądaną pozycję (tj źródło danych dla sublayout , jeśli występuje)

  2. Ustaw właściwość Path dla <sc:Sublayout> jako ścieżkę do Sublayout, który chcesz renderować.

Serwer/sitecore zajmie się resztą.

+2

To statyczne wstawianie sublayout w kodzie. Derek musi programowo wyrenderować kontrolę w języku C# i mieć ciąg wyjściowy odpowiedzi tej kontrolki w języku C#. Nie ma kontekstu strony, ponieważ jest w służbie. –