ASP.NET主题样式表呈现

时间:2010-05-26 22:09:47

标签: asp.net rendering themes stylesheet

当呈现具有主题的页面时,给定主题中的样式表链接标记将在结束头标记之前呈现。有谁知道改变它的方法?有没有办法可以将这些标签放在开头标签之后?

我知道只需选择所有链接标记并将其放在开头标记之后就可以使用jquery,但有没有办法在服务器端设置它?

澄清 我们假设我的主题中有一个css文件(themed.css)。在那个css文件中,我有一个id标记为test的单一样式定义:

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

我们还要说我有第二个css文件(standard.css)不在我的主题中,但它有另一个div标签的定义,其id为test:

#test {background-color:yellow;}

我的页面使用主题,我有一个手写的链接标记来使用standard.css。执行页面时,standard.css的链接标记位于themed.css之前。当发生这种情况时,id为test的div标签有红色背景和白色前景。如果我想要themed.css应用然后使用standard.css来覆盖必要的属性(带有白色forecolor的黄色背景),我会想要themed.css和THEN standard.css。我不能这样做,因为ASP.NET将主题文件放在关闭头标记之前。

我不想知道我的主题的css文件是我的head标签中的第n个链接标记,然后手动更改任何索引,只要我可以在我的主题之外添加新的css文件。

谢谢!

2 个答案:

答案 0 :(得分:6)

我在Reflector中做了一些检查,发现了一些你可能感兴趣的东西。框架调用SetStyleSheet派生对象的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);
}

<强>翻译? StyleSheetThemes在标题标记的 开头 中注入样式表,主题在 结束 中注入样式表

这与主题和样式表主题之间的预期差异一致;也就是说,当皮肤和控件设置之间存在冲突时,主题总会获胜。当然,使用!important属性的非主题.CSS文件中的样式仍然可以覆盖主题样式,但是头文件中CSS文件的定位策略性地促进了覆盖能力样式表主题。

请注意,您可以两者一个样式表主题和常规主题。当然,请将样式表主题设置为可覆盖的主题,以及不应覆盖的主题内容。

最后一个观察结果是该方法是internal且非虚拟的,因此干扰这两个选项将需要一些功夫 - MMA - 疯狂反射技能,并且可能不符合最佳利益稳定性或可维护性。

答案 1 :(得分:5)

只要您的head元素runat="server",就可以重新排列Page_PreRender中的集合:

    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);
        }
    }