当呈现具有主题的页面时,给定主题中的样式表链接标记将在结束头标记之前呈现。有谁知道改变它的方法?有没有办法可以将这些标签放在开头标签之后?
我知道只需选择所有链接标记并将其放在开头标记之后就可以使用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文件。
谢谢!
答案 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);
}
}