HtmlGenericControl("br") рендеринг дважды
Я добавляю некоторый контент на данную веб-страницу из кода. Когда я хочу добавить разрыв после некоторого текста, я пытаюсь сделать это следующим образом:
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"))
действует таким образом. Я также думаю, что мой подход не слишком причудливый.
С Уважением,
2 ответа
После некоторого тестирования, похоже, причина в том, что HtmlGenericControl
не поддерживает закрытие себя На стороне сервера HtmlGenericControl("br")
рассматривается как:
<br runat="server"></br>
Здесь нет </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"); }
}
}
И используйте это вместо:
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"))
На самом деле вы можете использовать;
pDoc.Controls.Add(new LiteralControl("<br/>"));
В то время как new HtmlGenericControl("br")
добавляет два <br>
, это только добавит <br/>
пометьте свой HTML, чтобы у вас была только одна пробел. На этой картинке я добавил эти разрывы с этим блоком кода.
Также похожий вопрос здесь: Управление сервером ведет себя странно