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();
}
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? –
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
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? –