$ .getJSON在IE8中返回caching的数据

我现在正在玩ASP.net MVC和JQuery。 我遇到了似乎没有道理的行为。

我调用JQuery的$.getJSON函数来填充一些div。 $(document).ready事件触发事件。 这完美的作品。

有一个小的AJAX.BeginForm增加了填充div时使用的另一个值。 它正确调用远程函数,并成功调用原来的JavaScript函数重新填充div。

这是怪异的部分:在FireFox和Chrome – 一切正常。 但在IE8(testing版)第二次调用填充的Div脚本(它调用$ .getJSON函数)获取caching的数据,并不要求服务器!

希望这个问题是有道理的:在一个坚果shell – 为什么$.getJSON获得caching的数据? 而为什么它只影响IE8?

只是为了让您知道,Firefox和Chrome将所有的Ajax请求视为不可caching的。 IE(所有版本)都像其他Web请求一样处理Ajax调用。 这就是为什么你看到这种行为。
如何强制IE在每个请求下载数据:

  • 正如你所说,使用JQuery中的“caching”或“nocache”选项
  • 向请求中添加一个随机参数(丑陋,但工作:))
  • 在服务器端,设置cachability(例如使用属性,见下文)

码:

 public class NoCacheAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext context) { context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); } } 

这是对我的工作…

 $.ajaxSetup({ cache: false }); $.getJSON("/MyQueryUrl",function(data,item) { // do stuff with callback data $.ajaxSetup({ cache: true }); }); 

感谢肯特你的答案。 使用$ .ajax('{cache:no}'); 完美的工作。 [编辑]

或者至less我以为我做到了。 似乎jQuery $ .getJSON不读取对$ .ajax对象所做的任何更改。

结束工作的解决scheme是手动添加一个新的参数

 var noCache = Date(); $.getJSON("/somepage/someaction", { "noCache": noCache }, Callback); 

date分辨率只是一分钟; 这实际上意味着这个解决scheme仍然可以caching一分钟。 这是我的目的可以接受的。

我通过在控制器的Action中放置以下属性来解决同样的问题:

 [OutputCache(Duration = 0, VaryByParam = "None")] 

如果您使用的是ASP.net MVC,请考虑添加一个扩展方法来轻松实现不caching,如下所示:

  public static void NoCache(this HttpResponse Response) { Response.Cache.SetNoStore(); Response.Cache.SetExpires(DateTime.MinValue); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetValidUntilExpires(false); Response.Expires = -1; Response.ExpiresAbsolute = DateTime.MinValue; Response.AddHeader("Cache-Control", "no-cache"); Response.AddHeader("Pragma", "no-cache"); } 

您可能需要发送caching断路器。

我build议使用$ .ajax({cache:no})以防万一(向获取请求添加一个随机后缀)

(我倾向于使用$ .ajax这些天到处,更可调)

准备好了吗?

http://lestopher.tumblr.com/post/21742012438/if-youre-using-ie8-and-getjson

所以,只需添加

 jQuery.support.cors = true; 

在你的脚本开始和爆炸它的作品!