102

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

我正在调用 JQuery 的$.getJSON函数来填充一些 div。事件在事件上触发$(document).ready。这完美地工作。

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

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

希望这个问题有意义:简而言之 - 为什么要$.getJSON获取缓存数据?为什么它只影响 IE8?

4

7 回答 7

107

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

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });
于 2008-12-11T00:16:41.853 回答
67

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

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

代码:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
于 2008-11-05T09:09:40.613 回答
16

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

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

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

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

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

于 2008-11-05T04:35:40.400 回答
11

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

[OutputCache(Duration = 0, VaryByParam = "None")]
于 2009-08-13T03:49:30.363 回答
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");
    }
于 2009-05-11T16:55:36.200 回答
2

您可能需要发送缓存破坏程序。

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

(这些天我倾向于在任何地方使用 $.ajax,更可调整)

于 2008-11-05T02:51:30.377 回答
2

准备好回答了吗?

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

所以,只需添加

jQuery.support.cors = true;  

在你的脚本的开头,BANG 它起作用了!

于 2012-05-29T07:44:31.710 回答