我正在编写一些代码,在后面的代码中为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>
,我认为它应该是对象的属性。
我是否遗漏了某些东西,或者这种控制无法实现?
由于
答案 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
使用此
覆盖HtmlGenericControlprotected 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方式。
这是特定于页面/控件的,不需要任何覆盖。因此它对您系统的其余部分影响最小。
null