Возникла странная проблема с методом 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.