10

我正在编写一些代码来将链接标签添加到后面代码中的头部标签......即

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>,我认为它应该是对象上的一个属性。

我是否遗漏了某些东西,或者使用此控件无法做到这一点?

谢谢

4

5 回答 5

11

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

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

编辑:这是一个例子(在 VB 中)

于 2009-11-10T13:59:54.067 回答
9

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

根据规范链接标签是一个空元素。它不能有任何内容,但可以自闭。W3C 验证器未验证<link></link>为正确的 html5。

显然

HtmlGenericControl css = new HtmlGenericControl("link");

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

HtmlLink css = new HtmlLink();

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

除了linkSystem.Web.UI.HtmlControls还包含其他 void 元素控件的类,例如imginputmeta

于 2013-01-02T16:21:46.553 回答
1

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

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

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

于 2010-03-18T12:10:19.343 回答
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
}
于 2010-03-28T07:48:56.553 回答
0

有点hacky的方式。

  • 将控件放在 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);
        }
    }
}
于 2017-04-12T12:19:43.823 回答