【问题标题】:ASP.NET Theme stylesheet renderingASP.NET 主题样式表呈现
【发布时间】:2010-05-26 22:09:46
【问题描述】:

当呈现带有主题的页面时,给定主题中的样式表链接标记会在结束的 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 具有红色背景和白色前景色。如果我想应用themed.css 然后standard.css 覆盖必要的属性(黄色背景和白色前景色),我想要themed.css 和THEN standard.css。我不能这样做,因为 ASP.NET 将主题文件放在结束 head 标记之前。

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

谢谢!

【问题讨论】:

    标签: asp.net rendering themes stylesheet


    【解决方案1】:

    我在 Reflector 中做了一些检查,发现了一些你可能会觉得有趣的东西。框架调用PageTheme 派生对象的SetStyleSheet 方法在标头中注入链接控件。这段代码sn -p显示了相关逻辑:

    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 在 beginning 头标签注入样式表,Themes 在 end 注入样式表.

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

    请注意,您可以同时拥有样式表主题和常规主题。自然,将您设计为可覆盖的样式表主题留给样式表主题,并将不应覆盖的主题留给主题。

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

    【讨论】:

      【解决方案2】:

      只要您的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);
              }
          }
      

      【讨论】:

      • 但这是在你的头脑中有静态数量的链接标签的概念。我更好奇是否有一种方法可以覆盖将链接标签放在首位的流程,而不仅仅是在案例之后重新排列它们。
      • 在 PreRender() 事件发生的那一刻,在当前主题文件夹中找到的所有 CSS 文件的链接已经在 Header.Controls 集合中。所以我的代码将重新排列静态和动态(由 ASP.NET 添加)链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2012-08-21
      • 1970-01-01
      • 2021-03-07
      • 2015-08-15
      • 1970-01-01
      相关资源
      最近更新 更多