Jquery $.getJSON返回IE8中的缓存数据

Jquery $.getJSON返回IE8中的缓存数据,jquery,asp.net-mvc,internet-explorer-8,getjson,Jquery,Asp.net Mvc,Internet Explorer 8,Getjson,目前我正在使用ASP.NETMVC和JQuery。我遇到了一些行为,这似乎毫无意义 我调用JQuery的$.getJSON函数来填充一些div。事件在$(document.ready事件上触发。这很好用 有一个小的AJAX.BeginForm,它在填充div时添加了另一个值。它正确地调用远程函数,成功后调用原始javascript函数重新填充div 奇怪的是:在FireFox和Chrome中,一切都正常。但是在IE8(Beta版)中,对populate Div脚本的第二次调用(调用$.getJS

目前我正在使用ASP.NETMVC和JQuery。我遇到了一些行为,这似乎毫无意义

我调用JQuery的
$.getJSON
函数来填充一些div。事件在
$(document.ready
事件上触发。这很好用

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

奇怪的是:在FireFox和Chrome中,一切都正常。但是在IE8(Beta版)中,对populate Div脚本的第二次调用(调用$.getJSON函数)获取缓存数据,而不询问服务器


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

您可能需要发送一个缓存断路器

我建议使用$.ajax({cache:no}),以防万一(在get请求中添加一个随机后缀)


(现在我倾向于在任何地方使用$.ajax,更易于调整)

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

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

最终有效的解决方案是手动添加一个新参数

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

决议的日期仅限于会议记录;这实际上意味着此解决方案的缓存时间仍长达一分钟。对于我的目的,这是可以接受的。

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

  • 正如您所说,在JQuery中使用'cache'或'nocache'选项
  • 向请求中添加随机参数(丑陋,但有效:)
  • 在服务器端,设置可访问性(例如,使用属性,请参见下文)
代码:


这就是我的工作方式

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

如果使用ASP.NET MVC,请考虑添加一个扩展方法来轻松实现不缓存,例如:

    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");
    }

通过在控制器中的操作上放置以下属性,我解决了相同的问题:

[OutputCache(Duration = 0, VaryByParam = "None")]
准备好回答了吗

所以,只需添加

jQuery.support.cors = true;  

在你的脚本的开始,砰的一声,它的工作

谢谢你的回答!。。。我还没有试过。将提供反馈shortlyvar noCache=new Date().getTime()//我会把你交给MSSCUNLIFE我对javascript非常陌生,ASP MVC为我打开了新的视野。你也可以尝试一些类似Math.Random()的东西。@Falkayn-tough
Math.Random()
可以使用,它的结果将是未知的,你可能会连续两次(或更多)得到相同的数字。使用
newdate().getTime()
将确保它不会重复。(除非你能回到过去)这个解决办法对我很有吸引力。我真的很喜欢在MVCT中应用attibute的优雅现在这里有一个OutputCacheAttribute OOTB。@bzlm但这更容易搜索签出客户端解决方案实际上,这是另一种方式,但我同意作为一名开发人员IE需要耐心:)我一直在努力解决这个问题,而您的解决方案提供了一种快速解决方法。:)我有一个问题,你知道$.ajaxSetup可以使用哪些选项吗?不幸的是,jQuery文档没有提供详细信息……可用选项与$相同。有关更多信息,请参阅上面代码的一点警告-它包含竞争条件。因为调用及其响应是异步的,所以应该调用
$.ajaxSetup({cache:true})
就在
getJSON()
之后,而不是在回调中。好主意-所以你在回调期间在服务器上调用这个扩展方法,对吗?太好了!很高兴有其他选择(我选择了这个)。感谢所有的贡献者!在Asp.NETMVC4.0上运行良好奇怪的是,我不仅在IE中看到了这个bug,在Firefox中也看到了。在jquery中禁用ajax缓存对我有帮助。
jQuery.support.cors = true;