代码之家  ›  专栏  ›  技术社区  ›  Tarik

在ASP.NET中以编程方式添加样式表

  •  25
  • Tarik  · 技术社区  · 14 年前

    我想在head部分以编程方式添加样式表,但我看到的一个示例似乎需要很多行代码才能只添加一个样式表,尽管我可能需要很多:

    示例代码:

    HtmlLink css = new HtmlLink();
    css.Href = "css/fancyforms.css";
    css.Attributes["rel"] = "stylesheet";
    css.Attributes["type"] = "text/css";
    css.Attributes["media"] = "all";
    Page.Header.Controls.Add(css);
    

    我也用 Page.Header.RenderControl() 方法,但也不起作用。对象为空,引发了错误。

    我也用过 Page.Header.InnerHtml InnerText += "<link .... "/> 但他们抛出了文字错误,这是我认为常见的错误。

    我用了这个代码:

    List<Literal> cssFiles = new List<Literal>();
    cssFiles.Add(new Literal() { Text = @"<link href=""" +   ResolveUrl("~/Resources/Styles/MainMaster/MainDesign.css") + @""" type=""text/css"" rel=""stylesheet"" />" });
    cssFiles.Add(new Literal() { Text = @"<link href=""" + ResolveUrl("~/Resources/Styles/MainMaster/MainLayout.css") + @""" type=""text/css"" rel=""stylesheet"" />" });
    AddStyleRange(cssFiles);
    
    private void AddStyleRange(List<Literal> cssFiles)
    {
       foreach (Literal item in cssFiles)
       {
         this.Header.Controls.Add(item);
       }
    }
    

    起初它起作用了,但当我换页时,它就不起作用了。

    我正在使用母版页,我正在编写这些代码 Master.cs 文件和一些建议使用的人 this.Header 而不是 Page.Header 但当我构建它时,它抛出一个错误,说我不能像这样声明。

    添加多种样式不应该那么难。

    这变得越来越复杂了。

    4 回复  |  直到 6 年前
        1
  •  44
  •   Kiquenet user385990    6 年前

    好的,下面是我目前使用的解决方案:

    我创建了一个助手类:

    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace BusinessLogic.Helper
    {
        public class CssAdder
        {
            public static void AddCss(string path, Page page)
            {
                Literal cssFile = new Literal() { Text = @"<link href=""" + page.ResolveUrl(path) + @""" type=""text/css"" rel=""stylesheet"" />" };
                page.Header.Controls.Add(cssFile);
            }
        }
    }
    

    然后通过这个助手类,我要做的就是:

    CssAdder.AddCss("~/Resources/Styles/MainMaster/MainDesign.css", this.Page);
    CssAdder.AddCss("~/Resources/Styles/MainMaster/MainLayout.css", this.Page);
    CssAdder.AddCss("~/Resources/Styles/Controls/RightMainMenu.css", this.Page);
    //...
    

    所以我可以用一行简单的代码添加尽可能多的内容。

    它还与母版页和内容页关系一起工作。

    希望它有帮助。

    附笔: 我不知道这个解决方案和其他解决方案之间的性能差异,但它看起来更优雅,更易于使用。

        2
  •  5
  •   Kay    14 年前

    我要把对我有用的东西贴上去:

    HtmlLink link = new HtmlLink();
    //Add appropriate attributes
    link.Attributes.Add("rel", "stylesheet");
    link.Attributes.Add("type", "text/css");
    link.Href = "/Resources/CSS/NewStyles.css";
    link.Attributes.Add("media", "screen, projection");
    //add it to page head section
    this.Page.Header.Controls.Add(link);
    

    即使我在这方面搜索了很多,我还是要在单击按钮时添加覆盖样式表。我使用了上面的代码,它对我非常有效。

        3
  •  3
  •   J. Horn    10 年前

    我定义通用HTML <link> 并以编程方式设置href属性。

    例如,在页面中 <head> 我有:

    <link id="cssStyle" runat="server" rel="stylesheet" type="text/css" />.
    

    然后在页面“加载”中设置cssstyle的href属性:

    cssStyle.Href = "path/to/Styles.css";
    

    看起来有点干净,有利于设计控制放置 <链路& GT; 按所需顺序。

        4
  •  2
  •   Adi Lester    12 年前

    我跨了一步,我想要一种方法,使我无法添加包含重复项,比如 ClientScriptManager.RegisterClientScriptInclude() . 解决方案是为添加在头部分中的控件提供一个ID。

    if (!String.IsNullOrEmpty(Key))
         if (Page.Header.FindControl(Key) != null) return;
    
    HtmlLink link = new HtmlLink();
    if (!String.IsNullOrEmpty(Key)) link.ID = Key;
    link.Href = StyleUrl; 
    link.Attributes.Add("type", "text/css"); 
    link.Attributes.Add("rel", "stylesheet");
    Page.Header.Controls.Add(link);
    

    对于我写的完整文章: http://www.idea-r.it/Blog.aspx?Article=49