我正在从代码后面的某个网页添加一些内容。当我想在一些文本之后添加一个中断时,我试着这样做:
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"))
以这种方式行事。我也认为我的方法不太花哨。
此致
答案 0 :(得分:21)
实际上你可以使用;
pDoc.Controls.Add(new LiteralControl("<br/>"));
new HtmlGenericControl("br")
添加了两个<br>
,而这只会在您的HTML中添加<br/>
标记,以便您只有1个空格行。
在这张图片中,我添加了那些代码块的中断。
此处也有类似问题: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"))