看起来,如果我使用$.get()加载动态内容,结果会缓存在浏览器中。

在QueryString中添加一些随机字符串似乎解决了这个问题(我使用new Date(). tostring()),但这感觉像是一个黑客。

还有别的办法吗? 或者,如果唯一字符串是实现这一点的唯一方法,除了new Date()还有其他建议吗?


当前回答

如果你正在使用。net ASP MVC,通过在end point函数上添加以下属性禁用控制器动作上的缓存:

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]

其他回答

Internet Explorer的Ajax缓存:你打算怎么做?提出了三种方法:

在查询字符串中添加一个缓存破坏令牌,比如?date=[timestamp]。在jQuery和YUI中,您可以告诉它们自动执行此操作。 使用POST而不是GET 发送一个HTTP响应头,明确禁止浏览器缓存它

如果你正在使用ie9,那么你需要在你的控制器类定义前使用以下代码:

[OutputCache(NoStore = true, duration = 0, VaryByParam = “*”)]

公共类TestController:控制器

这将阻止浏览器缓存。

有关此连结的详情: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

实际上这解决了我的问题。

另一种方法是在生成ajax调用响应的代码中不提供来自服务器端的缓存头:

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );

我个人觉得查询字符串方法比试图在服务器上设置头文件更可靠——不能保证代理或浏览器不会缓存它(有些浏览器比其他浏览器更差——没有命名)。

我通常使用Math.random(),但我不认为使用日期有任何错误(您不应该以足够快的速度执行AJAX请求来两次获得相同的值)。

正如@Athasach所说,根据jQuery文档,$. ajaxsetup ({cache:false})将不适用于GET和HEAD请求。

你最好从你的服务器发送回一个Cache-Control: no-cache头。它提供了更清晰的关注点分离。

当然,这对不属于项目的服务url不起作用。在这种情况下,您可以考虑从服务器代码代理第三方服务,而不是从客户端代码调用它。