Метод RenderControl не отображает самозакрывающиеся теги - PullRequest
6 голосов
/ 28 сентября 2011

Возникла странная проблема с методом RenderControl.

У меня есть UserControl (файл ASCX) с этой разметкой:

<ul>
<asp:Repeater ID="rptImages" runat="server">
    <ItemTemplate>
        <li>
            <a href="<%# ((Image)Container.DataItem).Url %>">
                <img src="<%# ((Image)Container.DataItem).Url %>?mw=80&mh=50" title="<%# ((Image)Container.DataItem).Title %>" alt="<%# ((Image)Container.DataItem).Alt %>" />
                <p><%# ((Image)Container.DataItem).Description %></p>
            </a>
        </li>
    </ItemTemplate>
</asp:Repeater>
</ul>

Когда этот код выполняется в обычном жизненном цикле страницы (например, когда он добавляется на страницу), он отображает действительный XHTML в качестве разметки:

<ul>
    <li>
        <a data-fullscreen="/someimage.jpg" href="/another-image.jpg">
             <img src="/myimage?mw=80&mh=50" title="Image Title" alt="Alt Text" />
             <p></p>
        </a>
    </li>
</ul>

Обратите внимание, что тег p имеет закрывающий тег (даже если он пустой), а тег image также имеет закрывающий тег.

Когда я создаю экземпляр этого элемента управления на сервере и пытаюсь проанализировать его в строку, используя метод RenderControl (), например:

StringBuilder builder = new StringBuilder();
using (StringWriter writer = new StringWriter(builder))
{
    using (XhtmlTextWriter htmlWriter = new XhtmlTextWriter(writer))
    {
        var control = (GalleryControl)LoadControl("~/layouts/Controls/Gallery/GalleryControl.ascx");
        control.Images = m_images;
        control.RenderControl(htmlWriter);
    }
}
return builder.ToString();

Тогда возвращаемый XHTML выглядит так:

<ul>
    <li>
        <a data-fullscreen="/someimage.jpg" href="/another-image.jpg">
             <img src="/myimage?mw=80&mh=50" title="Image Title" alt="Alt Text">
             <p>
        </a>
    </li>
</ul>

Обратите внимание, что в теге изображения отсутствует закрывающий тег, а тег p также не закрывается, что делает этот XHTML более недействительным.

Я провел весь день на этом. Я пробовал XhtmlTextWriter вместо HtmlTextWriter для передачи в RenderControl, но это не имело никакого значения.

Кто-нибудь еще сталкивался с этой проблемой? Это довольно странно, и многие из нас в команде в настоящий момент находятся в тупике! Любая помощь или идеи будут оценены.

EDIT:

Я, вероятно, должен был упомянуть, что этот код выполняется в стеке процессора Sitecore. Он работает в стеке процессоров "renderField" непосредственно перед процессором ExpandLinks.

1 Ответ

1 голос
/ 04 октября 2011

Я подозреваю, что эта строка не выполняется или исключение выдается и проглатывается, не позволяя завершить ее:

<%# ((Image)Container.DataItem).Description %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...