$ .getJSON在IE8中返回缓存数据

And*_*rry 103 asp.net-mvc jquery getjson internet-explorer-8

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

我正在调用JQuery的$.getJSON函数来填充一些div.该事件在事件中触发$(document).ready.这非常有效.

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

这是奇怪的部分:在FireFox和Chrome中 - 一切正常.但是在IE8(Beta)中,对填充的Div脚本(调用$ .getJSON函数)的第二次调用会获取缓存数据,而不会询问服务器!

希望这个问题有道理:在坚果壳中 - 为什么要$.getJSON获取缓存数据?为什么它只影响IE8?

Jit*_*til 106

这就是它对我有用的方式......

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

  • 对上面代码的一点警告 - 它包含竞争条件.因为调用及其响应是异步的,所以你应该在`getJSON()`之后调用`$ .ajaxSetup({cache:true});`而不是在回调中. (12认同)

Nic*_*ico 67

只是为了让您知道,Firefox和Chrome认为所有Ajax请求都是不可缓存的.IE(所有版本)将Ajax调用视为其他Web请求.这就是你看到这种行为的原因.
如何强制IE在每个请求下载数据:

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

码:

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


And*_*rry 16

谢谢肯特的回答.使用$ .ajax('{cache:no}'); 工作得很好.[编辑]

或者至少我以为我做到了.似乎jquery $ .getJSON没有读取对$ .ajax对象所做的任何更改.

最终工作的解决方案是手动添加新参数

var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
Run Code Online (Sandbox Code Playgroud)

日期解决方案仅限于分钟; 这实际上意味着这个解决方案仍然可以缓存长达一分钟.这对我来说是可以接受的.

  • var noCache = new Date().getTime(); //会给你ms (9认同)

Guy*_*Guy 11

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

[OutputCache(Duration = 0, VaryByParam = "None")]
Run Code Online (Sandbox Code Playgroud)