HtmlGenericControl(“br”)呈现两次

时间:2012-11-21 12:45:43

标签: asp.net vb.net htmlgenericcontrol

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

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"))

以这种方式行事。我也认为我的方法不太花哨。

此致

2 个答案:

答案 0 :(得分:21)

实际上你可以使用;

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

new HtmlGenericControl("br")添加了两个<br>,而这只会在您的HTML中添加<br/>标记,以便您只有1个空格行。 在这张图片中,我添加了那些代码块的中断。

enter image description here

此处也有类似问题:Server control behaving oddly

答案 1 :(得分:5)

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

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

HTML中没有</br>标记,因此浏览器会显示该标记,因为有两个<br />标记。很好的解决方法就是像这样创建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"))