【问题标题】:RenderControl method not rendering self-closing tagsRenderControl 方法不呈现自闭合标签
【发布时间】:2011-09-28 15:36:31
【问题描述】:

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>

注意 image 标签缺少结束标签,p 标签也没有结束,这使得这个 XHTML 不再有效。

我花了一整天的时间在这上面。我已经尝试使用 XhtmlTextWriter 而不是 HtmlTextWriter 来传递给 RenderControl,但这没有任何区别。

有没有其他人遇到过这个问题?这很奇怪,我们团队中的很多人此刻都难住了!任何帮助或想法将不胜感激。

编辑:

我可能应该提到,这段代码是在 Sitecore 处理器堆栈中执行的。它在 ExpandLinks 处理器之前的“renderField”处理器堆栈中运行。

【问题讨论】:

  • @Sam:RenderControl 方法继承自 Control 类。
  • 我创建了一个与您在此处显示的几乎相同的解决方案,但我无法重现相同的错误。输出的 HTML 是有效的。顺便说一下,我假设您的中继器的绑定发生在该图像设置器中? “数据全屏”从何而来,在任何 javascript 干预发生之前,您肯定会向我们提供 builder.ToString() 返回的内容?
  • 是的,我捕获了从 builder.ToString() 返回的文本并将其粘贴到此处。我认为可能还有其他东西弄乱了它,但这就是它从附加到 HtmlTextWriter 的 StringBuilder 返回的方式。
  • 只是为了好玩,在段落标签之间添加一个空格,看看会发生什么。
  • 能否将代码包含在 UserControl 中,如果需要可以简化?必须进行一些额外的工作才能将其他属性添加到 标记开始,那里可能有一些东西。我还怀疑通过 LoadControl 实例化控件不会执行您可能期望的所有用户控件事件,正如我在演示中所经历的那样。

标签: c# asp.net sitecore sitecore6


【解决方案1】:

我怀疑这条线没有执行,或者抛出异常并被吞没,不允许它完成:

<%# ((Image)Container.DataItem).Description %>

【讨论】:

  • 如果您能够在 Visual Studio 中调试它,请尝试更改调试设置以在抛出异常而不是捕获异常时显示停止;这是查找吞下异常的好方法,它位于 Debug -> Exceptions 选项中。
  • 我启用了异常,但没有抛出任何异常。另外,在将图像列表绑定到控件时,我检查了“描述”属性,它是一个空字符串,而不是 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2021-07-07
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多