2010-05-26 99 views
10

当主题的网页时,在给定的主题样式表的链接标签的结束标记前面的权利渲染。有谁知道改变这种方式的方法吗?有没有办法让这些标签可以放在开头标签之后?ASP.NET主题样式呈现

我知道它可以通过只选择所有的链接标签和head开头标记之后将其与jQuery下来,但有一种方法来设置它的服务器端?

澄清 让我们说我在我的主题,一个CSS文件(themed.css)。在此css文件,我有一个div标签的单一样式定义与测试的ID:

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

让我们也说我有第二个CSS文件(standard.css),是不是在我的主题,但它与测试的ID的div标签的另一个定义:

#test {background-color:yellow;} 

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

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

谢谢!

回答

6

我的确在反射有点检查,并发现了一些你可能会感兴趣。框架调用一个PageTheme衍生对象的SetStyleSheet方法在标题中注入链路控制。这段代码显示了相关的逻辑:

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文件的head标签内的定位战略上有利于覆盖能力风格主题。

请注意,您可以有样式表主题和常规主题。当然,请留意样式表主题设计为可覆盖的东西,以及不应被覆盖的主题。

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

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

但是,这是与你的头里有一个静态的链接标签数量的概念。我更加好奇的是,如果有一种方法可以覆盖将链接标签放在第一位的流程,而不是在案例之后重新排列它们。 – 2010-05-27 14:16:35

+0

目前PreRender()事件发生时,在当前主题文件夹中找到的所有CSS文件的链接已经在Header.Controls集合中。所以我的代码将重新排列静态和动态(由ASP.NET添加)链接。 – UserControl 2010-05-27 15:07:10