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, чтобы у вас была только одна пробел. На этой картинке я добавил эти разрывы с этим блоком кода.

Также похожий вопрос здесь: Управление сервером ведет себя странно

Другие вопросы по тегам