2011-05-24 59 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