Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET主题样式表呈现_Asp.net_Rendering_Themes_Stylesheet - Fatal编程技术网

ASP.NET主题样式表呈现

ASP.NET主题样式表呈现,asp.net,rendering,themes,stylesheet,Asp.net,Rendering,Themes,Stylesheet,呈现带有主题的页面时,给定主题中的样式表链接标记将在结束头标记之前呈现。有人知道改变这种状况的方法吗?有没有办法让我把这些标签放在开头的标签后面 我知道只需选择所有链接标记并将其放在开头的head标记之后,jquery就可以解决这个问题,但是有没有办法在服务器端设置它呢 澄清 假设我的主题中有一个css文件(themed.css)。在该css文件中,我对id为test的div标记有一个样式定义: #test {background-color:red; color:white;} 我们还可以说

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

我知道只需选择所有链接标记并将其放在开头的head标记之后,jquery就可以解决这个问题,但是有没有办法在服务器端设置它呢

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

#test {background-color:red; color:white;}
我们还可以说,我有第二个css文件(standard.css),它不在我的主题中,但它有另一个div标记的定义,id为test:

#test {background-color:yellow;}
我有我的页面使用的主题,我有一个手写链接标签使用标准.css。执行页面时,standard.css的链接标记位于themed.css之前。当这种情况发生时,我的id为test的div标签具有红色背景和白色前景色。如果我希望应用themed.css,然后使用standard.css覆盖必要的属性(黄色背景和白色前景色),那么我希望使用themed.css,然后使用standard.css。我不能这样做,因为ASP.NET将主题文件放在结束头标记的前面

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


谢谢

只要您的
元素具有
runat=“server”
您就可以在页面\u 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);
        }
    }
受保护的无效页面\u预呈现(对象发送方,事件参数e)
{
ControlCollection容器=this.Page.Header.Controls;
foreach(容器中的变量控件。of type().ToArray())
{
容器。移除(控制);
container.AddAt(0,控制);
}
}

我在Reflector中做了一些检查,发现了一些您可能会感兴趣的东西。框架调用
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);
}
翻译?样式表主题在标题标记的开始处注入样式表,主题在结束处注入样式表

这与主题和样式表主题之间的预期差异是一致的;也就是说,当外观和控件设置之间存在冲突时,主题始终获胜。当然,使用
在非主题.CSS文件中创建样式!重要信息
属性仍然可以覆盖主题样式,但将CSS文件定位在head标记中从战略上有助于覆盖样式表主题

请注意,您可以同时拥有样式表主题和常规主题。当然,将设计为可重写的样式表主题和不应重写的主题放在一边


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

但这是因为在你的头脑中有一个静态数量的链接标签。我更好奇的是,是否有一种方法可以覆盖放置链接标记的流程,这是第一个位置,而不仅仅是在案例之后重新排列它们。在PreRender()事件发生时,指向当前主题文件夹中找到的所有CSS文件的链接已经在Header.Controls集合中。因此,我的代码将重新排列静态和动态(由ASP.NET添加)链接。