JSON被错误地缓存了。

14

嗨!

我的JS正在请求从控制器获取的JSON文件以编辑现有对象,一个填充好的下拉列表。

接着,视图会将自动建议的下拉列表中的实际值发送出去,随后会将新值与旧值进行比较并存储新的数值。

就像人员列表一样。当我加载页面时,我的下拉列表中有一些人员,我可以添加或删除人员。

这是我的控制器:

    [HttpGet]
    public JsonResult JSON(int order)
    {
        IEnumerable<Person> persons = dataServ.Envolvidos.GetPerson( order )
        return this.Json( new { Result = persons }, JsonRequestBehavior.AllowGet );
    }

以下是我的Json调用:

$.getJSON("/Order/JSON", { order: $("#Id").val() }, function (data) {
   ...
});

一切都进行得很好,只是 I.E. 缓存了这个 JSON,当我发送新值并再次回到编辑页面时,旧值仍然存在,而不是新的值。但是新的值已经像应该的一样存储在数据库中。

我在 Chrome 和 Firefox 上进行了测试,在我编辑并再次编辑时,它会进行一个新的 JSON 调用并显示新的值,与 I.E. 不同。

我是不是漏掉了什么?我该怎么做才能使 JSON 结果不被缓存?

2个回答

20

这将禁用jQuery ajax的缓存:

jQuery.ajaxSetup({ cache: false });

是否缓存通常最好由提供数据的服务决定,因为它知道数据过期前的时间。这种解决方案将强制服务的所有客户端将此行代码放入其客户端代码中。如果不可接受,则需要修改服务以在其响应中包含适当的标头,指示客户端不应缓存。 - Jesse Webb
4
服务器端缓存和客户端缓存是非常不同的。在这种情况下,没有人强制客户端做任何事情。只是发生了 IE 客户端更倾向于比其他客户端更积极地缓存,因此 IE 需要这行代码。服务器端缓存可以独立于这个决定进行配置,而且应该这样做。至于使用服务器端创建的标头控制客户端缓存,我看不出有什么好处。这只会在服务器端和客户端代码之间创建紧密耦合,而你自己也认为这是不好的。 - Milimetric
想要更深入地了解这个话题,任何人都可以参考这里:http://dotnet.dzone.com/articles/output-caching-aspnet-mvc - Rosdi Kasim

9

我相信IE默认会缓存JSON请求,而其他浏览器则不会。你需要手动添加适当的头信息来告诉响应不要被缓存。这不会影响那些已经不缓存的现有浏览器,只是更加明确。


1
+1 这应该是正确的答案。HTTP缓存规范是针对源站点希望如何管理其内容的缓存而设计的。在JavaScript中更改它不会改变中间缓存代理的工作方式。因此,最好的做法是在服务器上指定适当的no-cache头,以便在所有情况下都能正常工作。 - Jerico Sandhorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接