我从代码背后向给定的网页添加了一些内容。当我想在一些文本后面添加一个分隔符时,我会尝试这样做:
pDoc.Controls.Add(New Label With {.Text = "whatever"})
pDoc.Controls.Add(New HtmlGenericControl("br"))
,其中pDoc是我在其中添加内容的Panel
。但它将两个br
标记添加到最终的HTML中。
我用这种方式避免了这种行为:
pDoc.Controls.Add(New Label With {.Text = "whatever" & "<br />"})
不管怎样,我很好奇,我想知道为什么
pDoc.Controls.Add(New HtmlGenericControl("br"))
就是这么做的。我也认为我的方法不是太花哨。
致以敬意,
发布于 2012-11-21 21:21:36
经过一些测试,看起来是因为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"))
https://stackoverflow.com/questions/13493586
复制相似问题