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

时间:2008-11-05 02:46:44

标签: jquery asp.net-mvc internet-explorer-8 getjson

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

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

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

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

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

7 个答案:

答案 0 :(得分:105)

这就是我的工作方式......

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

答案 1 :(得分:66)

只是为了让您知道,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);
    }
}

答案 2 :(得分:16)

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

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

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

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

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

答案 3 :(得分:11)

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

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

答案 4 :(得分:4)

如果您正在使用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");
    }

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:2)

准备回答了吗?

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

所以,只需添加

jQuery.support.cors = true;  

在脚本的开头,BANG可以工作!