Jquery $.getJSON返回IE8中的缓存数据
目前我正在使用ASP.NETMVC和JQuery。我遇到了一些行为,这似乎毫无意义 我调用JQuery的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
$.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;