ASP.NET - 如何仅在尚未包含 CSS 时才包含它?

Posted

技术标签:

【中文标题】ASP.NET - 如何仅在尚未包含 CSS 时才包含它?【英文标题】:ASP.NET - How to include CSS only if it isn't already included? 【发布时间】:2011-01-22 22:08:13 【问题描述】:

我使用下面的代码来动态包含一个 CSS 文件:

htmlHead head = (HtmlHead)Page.Header;
HtmlLink link = new HtmlLink();
link.Attributes.Add("href", Page.ResolveClientUrl("~/App_Themes/Default/StyleSheet.css"));
link.Attributes.Add("type", "text/css");
link.Attributes.Add("rel", "stylesheet");
head.Controls.Add(link);

问题是:我只想做一次,而且只有当它没有真正包含在页面中时。

我如何验证它是否已经包含在内?

编辑:

告诉我使用 !IsPostBack 包含在页面加载中的答案不会解决我的问题,因为此代码将位于 Web 用户控件中,并且我的页面可能有很多相同的用户控件。

例如,我用下面的代码用javascript来做:

if (!Page.ClientScript.IsClientScriptIncludeRegistered("jsScript"))

    Page.ClientScript.RegisterClientScriptInclude("jsScript", ResolveUrl("~/Utilities/myScript.js"));

【问题讨论】:

如果你的 CSS 结构合理,这可能是一个过早的优化。我无法想象你使用了这么多 CSS 会显着降低浏览器的速度。 @Robert Harvey:我知道,可能它不会减慢我的应用程序,我只是不喜欢在我的页面中放置垃圾代码的想法,今天我要放置一个 CSS只有 5KB,但是明天我装上 50KB 时,这将是一个问题...... @Jason:所以我需要更有可能发布更简单的问题?如果您查看我的问题,您会发现它们都很复杂,没有人回答可以解决问题的问题。 在您的示例中,您使用的是 App_Themes 目录。通过使用主题,ASP.NET 将自动将主题中的所有样式表链接到您的页面。您只需将 @Page 指令的 Theme 或 StylesheetTheme 属性设置为“Default”即可完成这项工作。如果您不希望这种行为,您应该考虑将样式表移到 App_Themes 目录之外。 【参考方案1】:

为什么不在您的用户控件中,向 HttpContext.Current.Items 添加一个值,表明样式表已经包含在内?这将避免您需要查看用户控件的每个实例的每个标题控件。

【讨论】:

这对我来说效果最好。另见***.com/questions/3876601/…【参考方案2】:

做到了吗……

我使用的代码如下:

        Boolean cssAlrealyIncluded = false;
        HtmlLink linkAtual;
        foreach (Control ctrl in Page.Header.Controls)
        
            if (ctrl.GetType() == typeof(HtmlLink))
            
                linkAtual = (HtmlLink)ctrl;

                if (linkAtual.Attributes["href"].Contains("datePicker.css"))
                
                    cssAlrealyIncluded = true;
                
            
        

        if (!cssAlrealyIncluded)
        
            HtmlLink link = new HtmlLink();
            link.Attributes.Add("href", ResolveUrl("~/Utilities/datePickerRsx/datePicker.css"));
            link.Attributes.Add("type", "text/css");
            link.Attributes.Add("rel", "stylesheet");
            Page.Header.Controls.Add(link);
        

【讨论】:

【参考方案3】:

在大多数情况下,您不必关心 CSS 是否被多次包含。这通常不是问题。

编辑:仅当您需要能够在后续样式表中覆盖 css 样式时,顺序才重要。

在 ASP.NET 中,您可以在母版页中包含 CSS(假设您有一个),然后保证只包含一次。由于母版页可以通过编程方式(甚至通过用户控件)获得,您甚至可以编写一些属性(或方法)来控制何时包含哪些 CSS 外部。

【讨论】:

我不同意大多数情况,在任何情况你想要覆盖某些CSS行为的地方,比如任何有主题的网站,订单很重要,这将是一个问题。 @lBushkin:如果我为我的用户控件使用母版页只会让我拥有母版页的多个副本,因为每个用户控件都会在运行时生成自己的母版页编译代码,而我'将面临与此问题相同的问题... @Tufo:您为页面定义母版页,而不是您的用户控件。母版页可以相互继承,但最终,每个 UC 不会有多个母版页实例。

以上是关于ASP.NET - 如何仅在尚未包含 CSS 时才包含它?的主要内容,如果未能解决你的问题,请参考以下文章

仅在组件尚未重新渲染时才渲染它

在 php 中运行仅在尚未运行时才运行的连续循环的最佳方法是啥?

带有 jQ​​uery 验证的 ASP.Net MVC Ajax 表单

如何修复 ASP.NET 错误“文件'nnn.aspx'尚未预编译,无法请求。”?

css 仅在存在URL参数时才显示第一部分

需要帮助使这个简单的 JQuery 图像悬停脚本仅在禁用 javascript 时才弃用为 CSS