HtmlGenericControl("br")呈现两次

adr*_*ico 6 vb.net asp.net htmlgenericcontrol

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

pDoc.Controls.Add(New Label With {.Text = "whatever"})
pDoc.Controls.Add(New HtmlGenericControl("br"))
Run Code Online (Sandbox Code Playgroud)

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

我这样避免这种行为:

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

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

pDoc.Controls.Add(New HtmlGenericControl("br"))
Run Code Online (Sandbox Code Playgroud)

这样做.我也认为我的方法不太花哨.

问候,

Ber*_*ncı 22

其实你可以用;

pDoc.Controls.Add(new LiteralControl("<br/>"));
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

这里也有类似的问题:服务器控制行为奇怪


tpe*_*zek 5

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

<br runat="server"></br>
Run Code Online (Sandbox Code Playgroud)

</br>HTML中没有标记,因此浏览器显示它,因为有两个<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"); }
    }
}
Run Code Online (Sandbox Code Playgroud)

而是使用它:

pDoc.Controls.Add(New Label With {.Text = "whatever"})
pDoc.Controls.Add(New HtmlGenericSelfCloseControl("br"))
Run Code Online (Sandbox Code Playgroud)

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

pDoc.Controls.Add(New Label With {.Text = "whatever"})
pDoc.Controls.Add(Page.ParseControl("br"))
Run Code Online (Sandbox Code Playgroud)