Самозакрывающийся HTML Общий контроль? - PullRequest
8 голосов
/ 10 ноября 2009

Я пишу немного кода, чтобы добавить тег ссылки к тегу head в коде позади ... то есть

HtmlGenericControl css = new HtmlGenericControl("link");

css.Attributes["rel"] = "Stylesheet";
css.Attributes["type"] = "text/css";
css.Attributes["href"] = String.Format("/Assets/CSS/{0}", cssFile);

чтобы попытаться достичь чего-то вроде ...

<link rel="Stylesheet" type="text/css" href="/CSS/Blah.css" />

Я использую HtmlGenericControl для достижения этого ... у меня проблема в том, что элемент управления в конечном итоге отображается как ...

<link rel="Stylesheet" type="text/css" href="/CSS/Blah.css"></link>

Я не могу найти то, что мне не хватает, чтобы не визуализировать дополнительные </link>, я предположил, что это должно быть свойство объекта.

Я что-то упустил или это просто невозможно с этим управлением?

Спасибо

Ответы [ 5 ]

10 голосов
/ 10 ноября 2009

Я думаю, вам нужно извлечь из HtmlGenericControl и переопределить метод Render.

После этого вы сможете написать "/>" самостоятельно (или можете использовать константу HtmlTextWriter's SelfClosingTagEnd).

Редактировать: Вот пример (в VB)

8 голосов
/ 02 января 2013

При попытке написать обходной путь для umbraco.library:RegisterStyleSheetFile(string key, string url) я столкнулся с тем же вопросом, что и ОП, и обнаружил следующее.

Согласно спецификациям , тег link является пустым элементом. Он не может иметь никакого содержимого, но может быть самозакрывающимся. Валидатор W3C не подтвердил <link></link> как правильный html5.

Видимо

HtmlGenericControl css = new HtmlGenericControl("link");

по умолчанию отображается как <link></link>. Использование специального элемента управления для тега link решило мою проблему:

HtmlLink css = new HtmlLink();

Создает наценку <link/>, которая была проверена как правильные xhtml и html5.

В дополнение к ссылка , System.Web.UI.HtmlControls содержит классы для других элементов управления void, таких как img , input и meta .

1 голос
/ 18 марта 2010

В качестве альтернативы вы можете использовать Page.ParseControl(string), что дает вам элемент управления с тем же содержимым, что и переданная вами строка.

На самом деле я делаю то же самое в моем текущем проекте. Конечно, для этого требуется ссылка на текущую страницу (обработчик), но это не должно создавать никаких проблем.

Единственное предостережение в этом методе, на мой взгляд, состоит в том, что вы не получаете никакого "OO" -подхода для создания вашего элемента управления (например, control.Attributes.Add("href", theValue") и т. Д.)

0 голосов
/ 12 апреля 2017

слегка хакерский путь.

  • Поместите элемент управления в элемент PlaceHolder.
  • В коде за угон метода рендеринга PlaceHolder.
  • Рендеринг содержимого PlaceHolders в точности так, как вы хотите.

Это зависит от страницы / элемента управления и не требует переопределений. Так что это оказывает минимальное влияние на остальную часть вашей системы.

<asp:PlaceHolder ID="myPlaceHolder" runat="server">
    <hr id="someElement" runat="server" />
</asp:PlaceHolder>

protected void Page_Init(object sender, EventArgs e)
{
    myPlaceHolder.SetRenderMethodDelegate(ClosingRenderMethod);
}

protected void ClosingRenderMethod(HtmlTextWriter output, Control container)
{
    var voidTags = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) { "br", "hr", "link", "img" };
    foreach (Control child in container.Controls)
    {
        var generic = child as HtmlGenericControl;
        if (generic != null && voidTags.Contains(generic.TagName))
        {                
            output.WriteBeginTag(generic.TagName);
            output.WriteAttribute("id", generic.ClientID);
            generic.Attributes.Render(output);
            output.Write(HtmlTextWriter.SelfClosingTagEnd);                
        }
        else
        {
            child.RenderControl(output);
        }
    }
}
0 голосов
/ 28 марта 2010

Я только что создал решение для этого, основываясь на комментариях Ragaraths на другом форуме:

http://forums.asp.net/p/1537143/3737667.aspx

Переопределите HtmlGenericControl с этим

protected override void Render(HtmlTextWriter writer)
{
    if (this.Controls.Count > 0)
        base.Render(writer); // render in normal way
    else
    {
        writer.Write(HtmlTextWriter.TagLeftChar + this.TagName); // render opening tag
        Attributes.Render(writer); // Add the attributes.  
        writer.Write(HtmlTextWriter.SelfClosingTagEnd); // render closing tag   
    }

    writer.Write(Environment.NewLine); // make it one per line
}
...