代码之家  ›  专栏  ›  技术社区  ›  Dan Appleyard

ASP.NET主题样式表呈现

  •  10
  • Dan Appleyard  · 技术社区  · 14 年前

    当呈现具有主题的页面时,给定主题中的样式表链接标记将在结束标题标记之前呈现。有人知道如何改变这种情况吗?有没有一种方法可以让我把那些标签放在开头的标签后面?

    我知道只需选择所有链接标记并将其放在开头的head标记之后,jquery就可以将其关闭,但是是否有方法在服务器端设置它?

    澄清 假设我的主题中只有一个CSS文件(themed.css)。在这个CSS文件中,我为一个ID为test的DIV标记定义了一个样式:

    #test {background-color:red; color:white;}
    

    假设我还有第二个CSS文件(standard.css),它不在我的主题中,但它有另一个ID为test的DIV标记定义:

    #test {background-color:yellow;}
    

    我有我的页面来使用这个主题,并且我有一个手写的链接标签来使用standard.css。执行页面时,standard.css的链接标记在themed.css之前。当发生这种情况时,我的DIV标签(ID为TEST)有一个红色背景和白色前灯。如果我希望应用themed.css,然后使用standard.css覆盖必要的属性(黄色背景和白色前景色),我希望使用themed.css,然后使用standard.css。我不能这样做,因为ASP.NET将主题文件放在结束标题标记之前。

    我不想知道我的主题的CSS文件是我头标记中的第n个链接标记,然后每当我在主题之外添加新的CSS文件时,手动更改任何索引。

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  6
  •   kbrimington    14 年前

    我检查了一下反射镜,发现了一些有趣的东西。框架调用 SetStyleSheet A方法 PageTheme -要在头中插入链接控件的派生对象。此代码段显示相关逻辑:

    int num = 0;
    foreach (string str in this.LinkedStyleSheets)
    {
        HtmlLink child = new HtmlLink { Href = str };
        child.Attributes["type"] = "text/css";
        child.Attributes["rel"] = "stylesheet";
        if (this._styleSheetTheme)
            this.Page.Header.Controls.AddAt(num++, child);
        else
            this.Page.Header.Controls.Add(child);
    }
    

    翻译 ?样式表主题在 开始 标题标记,主题将样式表插入到 结束 .

    这与主题和样式表主题之间的预期差异一致;也就是说,当外观和控件设置之间存在冲突时,主题总是获胜。当然,非主题.css文件中的样式使用 !important 属性仍然可以覆盖一个主题样式,但是在head标签中CSS文件的定位策略上有助于覆盖能力样式表主题。

    注意你可以 二者都 样式表主题和常规主题。当然,让您设计的样式表主题可以被覆盖,而让那些不应该被覆盖的主题可以被覆盖。

    最后一个观察结果是 internal 而非虚拟的,所以干扰这两个选项需要一些功夫mma疯狂的反射技能,而且可能不符合稳定性或可维护性的最佳利益。

        2
  •  5
  •   UserControl    14 年前

    只要你 head 元素已经 runat="server" 可以在“页面预呈现”中重新排列集合:

        protected void Page_PreRender(object sender, EventArgs e)
        {
            ControlCollection container = this.Page.Header.Controls;
            foreach (var control in container.OfType<System.Web.UI.HtmlControls.HtmlLink>().ToArray())
            {
                container.Remove(control);
                container.AddAt(0, control);
            }
        }