2011-12-06 18 views
3

我正在使用ASP.NET主题的网站上工作。我遇到的问题是我更新了CSS文件,但原始文件被用户的浏览器保存。我想知道是否有办法强制浏览器获取最新的CSS文件。如何在使用ASP.NET主题时强制刷新CSS?

主题是通过类似的代码设置:

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

我看到其他的答案类似的问题这表明,我追加一个版本号的CSS文件,例如/CssFile.css?v=1.2.3

有没有办法让我这样做ASP.NET主题?

回答

4

我有一个类似的问题;您可以设置IIS为CSS文件添加content-expiration header,以便它们永远不会被缓存,也可以使用此SO问题中提供的解决方案here

您还可以为每个页面添加一个方法以通过在page.header(!甚至在你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加载内容,因此应该为每个用户再次请求内容。显然,这是更多的工作,但应该是每个发布一次,并没有你在下面提到的开销。

+0

有趣,但每一页的CPU成本太高,每次都是永远,只是为了一次更新。 – Aristos

+0

@Aristos然后我唯一能想到的就是将主题名称中的应用版本号。至少每个版本都会使用每个主题的独特版本,这意味着将为该内容发布新的请求。 – dash

+0

我使用一个读取所有css的复杂类,最小化它们,在文件上添加版本,并在每次更新中缓存一次(在数据库上)一次,然后只读取现有的现有文件。 asp.net 4.5有一个类似的inbuild函数。 – Aristos