【问题标题】:HtmlGenericControl("br") rendering twiceHtmlGenericControl("br") 渲染两次
【发布时间】:2012-11-21 12:45:42
【问题描述】:

我正在从后面的代码向给定网页添加一些内容。当我想在一些文本之后添加中断时,我会尝试这样做:

pDoc.Controls.Add(New Label With {.Text = "whatever"})
pDoc.Controls.Add(New HtmlGenericControl("br"))

,其中 pDoc 是我要在其中添加内容的Panel。但它在最终的 HTML 中添加了两个 br 标签。

我已经通过这种方式避免了这种行为:

pDoc.Controls.Add(New Label With {.Text = "whatever" & "<br />"})

无论如何,我很好奇,我想知道为什么

pDoc.Controls.Add(New HtmlGenericControl("br"))

就是这样。我也觉得我的做法不太花哨。

问候,

【问题讨论】:

  • 你确定它渲染的是&lt;br&gt;&lt;br&gt;而不是&lt;br&gt;&lt;/br&gt;
  • 是的,他是对的,它正在渲染

标签: asp.net vb.net htmlgenericcontrol


【解决方案1】:

其实可以用;

pDoc.Controls.Add(new LiteralControl("<br/>"));

new HtmlGenericControl("br") 添加了两个&lt;br&gt;,这只会在您的HTML 中添加&lt;br/&gt; 标记,因此您只有1 个空格行。 在这张图片中,我使用该代码块添加了这些中断。

这里也有类似的问题:Server control behaving oddly

【讨论】:

  • 感谢您的回答。它工作正常。我赞成,但没有标记为正确答案,因为我认为前一个更具体到我的问题。
【解决方案2】:

经过一些测试,原因似乎是HtmlGenericControl 不支持自关闭。在服务器端,HtmlGenericControl("br") 被视为:

<br runat="server"></br>

HTML 中没有&lt;/br&gt; 标记,因此浏览器显示为有两个&lt;br /&gt; 标记。解决这个问题的好方法是像这样创建HtmlGenericSelfCloseControl(对不起,对于 C# 代码,但在 VB.NET 中重写它应该没有问题):

public class HtmlGenericSelfCloseControl : HtmlGenericControl
{
    public HtmlGenericSelfCloseControl()
        : base()
    {
    }

    public HtmlGenericSelfCloseControl(string tag)
        : base(tag)
    {
    }

    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write(HtmlTextWriter.TagLeftChar + this.TagName);
        Attributes.Render(writer);
        writer.Write(HtmlTextWriter.SelfClosingTagEnd);
    }

    public override ControlCollection Controls
    {
        get { throw new Exception("Self closing tag can't have child controls"); }
    }

    public override string InnerHtml
    {
        get { return String.Empty; }
        set { throw new Exception("Self closing tag can't have inner content"); }
    }

    public override string InnerText
    {
        get { return String.Empty; }
        set { throw new Exception("Self closing tag can't have inner text"); }
    }
}

改用它:

pDoc.Controls.Add(New Label With {.Text = "whatever"})
pDoc.Controls.Add(New HtmlGenericSelfCloseControl("br"))

作为更简单的替代方案(如果您参考了Page),您可以尝试使用Page.ParseControl

pDoc.Controls.Add(New Label With {.Text = "whatever"})
pDoc.Controls.Add(Page.ParseControl("br"))

【讨论】:

  • HtmlControl继承不是更容易吗?然后你只需要构造函数,如果你想要一个 XHTML 风格的自闭合标签,可能还需要覆盖 RenderAttributes
  • @RichardDeeming 很可能是的,我前段时间刚刚在我的一个项目中编写了这段代码,我在没有考虑重构的情况下粘贴了它。
  • Page.ParseControl("br") 对我不起作用。 Page.ParseControl("
    ") 确实有效。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多