Метод RenderControl не отображает самозакрывающиеся теги

Возникла странная проблема с методом 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 имеет закрывающий тег (даже если он пуст), а тег изображения также имеет закрывающий тег.

Когда я создаю экземпляр этого элемента управления на сервере и пытаюсь преобразовать его в строку с помощью метода 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, но это не имело никакого значения.

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

РЕДАКТИРОВАТЬ:

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


person NullReferenceException    schedule 28.09.2011    source источник
comment
@Sam: метод RenderControl унаследован от класса Control.   -  person James Johnson    schedule 28.09.2011
comment
Я создал решение, которое почти такое же, как то, что вы показали здесь, и я не могу воспроизвести ту же ошибку. Выводимый HTML-код действителен. Кстати, я предполагаю, что привязка вашего ретранслятора происходит в этом установщике изображений? Откуда берется этот полноэкранный режим, вы определенно даете нам то, что возвращает builder.ToString (), до того, как произойдет какое-либо вмешательство javascript?   -  person Kasaku    schedule 28.09.2011
comment
Да, я поймал текст, возвращенный builder.ToString (), и вставил его сюда. Я подумал, что, возможно, с этим что-то еще связано, но именно так он возвращается из StringBuilder, что он прикреплен к HtmlTextWriter.   -  person NullReferenceException    schedule 28.09.2011
comment
Просто для удовольствия добавьте пробел между тегами абзаца и посмотрите, что произойдет.   -  person NotMe    schedule 28.09.2011
comment
Не могли бы вы включить код в UserControl, если нужно, упрощенный? Там должна быть какая-то дополнительная работа, чтобы для начала добавить дополнительные атрибуты к тегу ‹a›, там что-то может быть. Я также подозреваю, что создание экземпляра элемента управления через LoadControl не приведет к выполнению всех событий usercontrol, которые вы могли бы выполнить, как я испытал в своей демонстрации.   -  person Kasaku    schedule 28.09.2011
comment
В UserControl нет никаких событий. Он просто привязывает повторители к списку ‹› объектов.   -  person NullReferenceException    schedule 04.10.2011


Ответы (1)


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

<%# ((Image)Container.DataItem).Description %>
person rick schott    schedule 04.10.2011
comment
Если вы можете отладить это в Visual Studio, попробуйте изменить настройки отладки, чтобы отображалась остановка, когда возникает исключение, а не обнаружено; это хороший способ найти проглоченные исключения, он находится в параметрах «Отладка -› Исключения ». - person Russ Clarke; 04.10.2011
comment
Я включил исключения, но ни одно из них не выбрасывается. Кроме того, при привязке списка изображений к элементу управления я проверил свойство Description, и это пустая строка, а не пустая. - person NullReferenceException; 04.10.2011