如何在使用ASP.NET主题时强制刷新CSS?

5

我正在处理一个使用ASP.NET主题的网站。我遇到的问题是,虽然我已经更新了CSS文件,但用户浏览器中仍保存着原始文件。我想知道是否有方法可以强制浏览器获取最新的CSS文件。

类似这样的代码设置了主题:

private void SetPageTheme()
{
    Page.Theme = "ClientA_Theme";
}

我看到其他类似问题的答案建议我在CSS文件名后附加版本号,例如/CssFile.css?v=1.2.3

在ASP.NET主题中我能否这样做?

1个回答

6
我遇到过类似的问题;你可以设置IIS添加内容过期标头到CSS文件中,这样它们就不会被缓存,或者你可以使用在这里提出的解决方案的解决方案。
你还可以为每个页面添加一个方法,以便遍历页面头部中的控件(甚至是Master.Page中的控件!)并执行以下操作:
protected override void OnPreRender(System.EventArgs e)    
{        
        foreach (Control link in Page.Header.Controls)        
        {                       
            if (link is HtmlLink)            
            {                  
                HtmlLink cssLink = link as HtmlLink;
                //Check if CSS link 
                if (cssLink.Attributes["type"].Equals("text/css", StringComparison.CurrentCultureIgnoreCase))                
                {                    
                    if (cssLink.Attributes["href"].Equals(String.Format("~/App_Themes/{0}/{0}.css", Page.Theme), StringComparison.CurrentCultureIgnoreCase))                    
                    {      
                        //perhaps add the version of your app here.                                                                
                        cssLink.Attributes["href"] += "?v1.1";                                          
                    }                
                }            
            }        
        }
        base.OnPreRender(e);     
    }

另一种技术是在主题名称中包含版本号,例如MyTheme1_1或类似名称。每次发布后,都会从“新”的URL加载内容,因此每个用户都应该重新请求内容。显然,这需要更多工作,但每次发布只需进行一次,而且没有下面提到的开销。

有趣,但每个页面,每次更新都需要太多的CPU成本,而且是永久性的。 - Aristos
@Aristos 那么我能想到的唯一另一件事就是在主题名称中放置您应用程序的版本号。至少这样每个发布版本都将使用每个主题的独特版本,这意味着新请求将针对该内容发出。 - dash
我使用一个复杂的类来读取所有的CSS,将它们最小化,添加文件版本,并在每次更新时仅缓存一次(在数据库中),然后只需读取现成的文件。ASP.NET 4.5有一个类似的内置函数。 - Aristos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接