我现在正在玩ASP.net MVC和JQuery.我遇到了似乎没有意义的行为.
我正在调用JQuery的$.getJSON
函数来填充一些div.该事件在事件中触发$(document).ready
.这非常有效.
有一个小的AJAX.BeginForm
,添加了在填充div时使用的另一个值.它正确调用远程函数,并在成功时调用原始的javascript函数来重新填充div.
这是奇怪的部分:在FireFox和Chrome中 - 一切正常.但是在IE8(Beta)中,对填充的Div脚本(调用$ .getJSON函数)的第二次调用会获取缓存数据,而不会询问服务器!
希望这个问题有道理:在坚果壳中 - 为什么要$.getJSON
获取缓存数据?为什么它只影响IE8?
这就是它对我有用的方式......
$.ajaxSetup({ cache: false }); $.getJSON("/MyQueryUrl",function(data,item) { // do stuff with callback data $.ajaxSetup({ cache: true }); });
只是为了让您知道,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); } }
谢谢肯特的回答.使用$ .ajax('{cache:no}'); 工作得很好.[编辑]
或者至少我以为我做到了.似乎jquery $ .getJSON没有读取对$ .ajax对象所做的任何更改.
最终工作的解决方案是手动添加新参数
var noCache = Date(); $.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
日期解决方案仅限于分钟; 这实际上意味着这个解决方案仍然可以缓存长达一分钟.这对我来说是可以接受的.
我通过在Controller中的Action上放置以下属性来解决同样的问题:
[OutputCache(Duration = 0, VaryByParam = "None")]