自我关闭Html通用控件?

时间:2009-11-10 13:40:26

标签: c# asp.net htmlgenericcontrol link-tag

我正在编写一些代码,在后面的代码中为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 个答案:

答案 0 :(得分:10)

我认为您必须从HtmlGenericControl派生,并覆盖Render方法。

然后你就可以写出“/&gt;”你自己(或者你可以使用HtmlTextWriter的SelfClosingTagEnd常量)。

编辑:Here's an example(在VB中)

答案 1 :(得分:8)

在尝试为umbraco.library:RegisterStyleSheetFile(string key, string url)编写解决方法时,我最终得到了与OP相同的问题并找到了以下内容。

根据specs链接标记是一个void元素。它不能有任何内容,但可以自我关闭。 W3C验证器未将<link></link>验证为正确的html5。

显然

HtmlGenericControl css = new HtmlGenericControl("link");

默认呈现为<link></link>。使用链接标记的特定控件解决了我的问题:

HtmlLink css = new HtmlLink();

它产生标记<link/>,它被验证为正确的xhtml和html5。

链接外,System.Web.UI.HtmlControls还包含其他无效元素控件的类,例如 img 输入

答案 2 :(得分:1)

或者你可以使用Page.ParseControl(string),它为你提供一个控件,其内容与你传递的字符串相同。

我实际上在我当前的项目中做了同样的事情。当然它需要引用当前页面(处理程序),但这不应该造成任何问题。

在我看来,这种方法唯一需要注意的是,你没有得到任何“OO”方法来创建你的控件(例如。control.Attributes.Add("href", theValue")等。)

答案 3 :(得分:0)

我刚刚在另一个论坛上根据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
}

答案 4 :(得分:0)

稍微 hacky方式。

  • 将控件放在PlaceHolder元素中。
  • 在劫持PlaceHolder的渲染方法背后的代码中。
  • 完全按照您的意愿渲染PlaceHolders内容。

这是特定于页面/控件的,不需要任何覆盖。因此它对您系统的其余部分影响最小。

null