8

可能重复:
App_Theme 文件夹中的 CSS 缓存在浏览器中

我已经看到“什么是强制浏览器重新加载缓存的 CSS/JS 文件的优雅方式? ”但是那里的答案使用 PHP,它没有解决 CSS 是由 ASP.Net 主题动态注入的事实。

4

4 回答 4

14

我想我有一个快速而肮脏的解决方案。诀窍是检查页眉中的控件(例如在PreRender阶段中),找到指向文件App_Themes夹下 CSS 文件的链接并使它们动态化(通过向查询字符串添加一些随机信息)。这很可能会告诉浏览器使文件的缓存版本无效。

编码:

protected void Page_PreRender(object sender, EventArgs e)
{
    HtmlLink link = null;

    foreach (Control c in Header.Controls)
    {
        if (c is HtmlLink)
        {
            link = c as HtmlLink;

            if (link.Href.IndexOf("App_Themes/", StringComparison.InvariantCultureIgnoreCase) >= 0 &&
                link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase))
            {
                link.Href += string.Format("?t={0}", DateTime.Now.Ticks.ToString());
            }
        }
    }
}

输出:

    <link href="App_Themes/MyTheme/MyTheme.css?t=634310637798128189" 
        type="text/css" rel="stylesheet" />

请注意,您需要<head runat="server">在页面的标记中声明一个才能访问该Header属性(否则它将是null)。

于 2011-01-19T19:05:26.323 回答
1

我还没有找到对 App_Themes 文件进行版本控制的方法(还),但是您可以将它们设置为在相对较短的时间内(例如 10 秒)到期,这将最大限度地减少缓存问题,同时为您提供缓存的一些性能优势. 请记住,如果文件没有更改,服务器将响应 304-未修改,因此即使浏览器请求文件,流量也会减少。

将此添加到<configuration>Web.Config 的部分

<location path="App_Themes">
    <system.webServer>
        <staticContent>
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:00:10" />
        </staticContent>
    </system.webServer>
</location>
于 2013-02-04T13:16:04.660 回答
1

如果您询问服务器端如何强制重新加载...一种方法是动态更改 CSS/JS 的文件名,以便后续调用页面需要不同的文件。

<sarcasm> 另一种是简单地告诉用户按 CTRL-F5 :) </sarcasm>

于 2011-01-19T19:35:56.500 回答
1

完成对站点的更改后,手动更改 css 的名称。

于 2012-03-16T13:42:30.177 回答