2011-05-24 49 views
14

Hy!Json正在缓存不正确

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

然后,视图会从我的autosuggest下拉列表中发送实际值,最后将新值与旧值进行比较并存储新值。

它就像一个人名单。当我加载页面时,ddl中有一些人员,我可以添加或删除人员。

这是我的控制器:

[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结果不会被缓存?

回答

20

这将jQuery的AJAX禁用缓存:

jQuery.ajaxSetup({ cache: false }); 
+0

Tks man !!!!它真的有帮助! – Thiago 2011-05-24 19:14:27

+0

是否缓存通常更好的是服务于数据的服务,因为它知道数据陈旧之前的时间。此解决方案将强制服务的所有客户端将此行放入其客户端代码中。如果这是不可接受的,则需要修改该服务以在其响应中包括适当的头部,以向客户端指示他们不应该缓存。 – 2011-05-24 22:57:03

+4

@Gweebz。服务器端和客户端缓存完全不同。在这种情况下,没有人强迫客户这么做。恰巧IE客户端喜欢比其他客户端更积极缓存,所以IE需要这一行代码。服务器端缓存可以并应该独立于此决策进行配置。至于用服务器端创建的头文件控制客户端缓存,我没有看到好处。它只会在服务器端和客户端代码之间建立一种紧密的耦合,您自己认为这是不好的。 – Milimetric 2011-05-24 23:05:34

8

我相信IE默认缓存JSON请求,与其他浏览器不同。您将不得不手动包含适当的标头,以告诉响应不被缓存。这不会伤害已经不缓存的现有浏览器,它只会更加明确。

+1

+1这应该是正确的答案。缓存的HTTP规范着眼于原始内容如何在缓存方面管理其内容。在javascript中更改它不会改变中间缓存代理的工作方式。因此,最好的办法是在服务器上指定正确的no-cache标头,以便在任何情况下都能正常工作。 – 2014-01-15 19:40:46