Как получить контент рендеринга программно?

Я пытаюсь написать метод, который выводит содержимое (т.е. HTML) для любых визуализаций, которые существуют в конкретном заполнителе. Цель состоит в том, чтобы передать в Sitecore.Data.Items.Item и ключ-заполнитель, который мне интересен, и метод должен вернуть отображаемый контент.

Проблема заключается в том, что не существует контекста страницы, и поэтому вызов RenderControl() вызывает ошибку нулевой ссылки в методе GetCacheKey() для Sublayout.

Кто-нибудь знает о способе визуализации рендеринга Sublayout или XSLT?

Вот что у меня до сих пор:

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

Ответ 1

На мой взгляд, лучший способ программно отобразить Sublayout - использовать ретранслятор и поместить тег <sc:Sublayout> в <ItemTemplate>.

Оттуда вам нужно сделать только одно или оба из следующих действий:

  • Задайте свойство DataSource для <sc:Sublayout> как строковое представление GUID желаемого элемента (т.е. источника данных для sublayout, если есть)

  • Задайте свойство Path для <sc:Sublayout> как путь к Sublayout, который вы хотите отобразить.

Сервер/sitecore будет обрабатывать остальные.