2010-01-08 128 views
1

由於從mvc 2 beta 2升級到rc,我在使用Internet Explorer中的ajax提交時遇到了問題。在執行一個jQuery表單發佈後,該函數返回一個url到控制器動作。這與控制器操作正常工作罰款這是一個Ajax請求,然後回滾部分視圖來更新頁面。這在Firefox中仍然正常工作,但是在Internet Explorer中,對控制器操作的最終調用現在來自緩存,因此返回的是完整視圖而非部分視圖。ASP.NET MVC 2 RC緩存問題

我試着將輸出緩存設置爲0沒有成功,我也嘗試了nocache actionfilter,如Disable browser cache for entire ASP.NET website所述,沒有運氣。我可以阻止IE從緩存中提取的唯一方法是物理刪除緩存版本。

任何人有任何想法(道歉,如果這不是很清楚,棘手的解釋!)?

回答

3

由於某些原因,IE瀏覽器對於緩存AJAX GETs非常積極。所以如果你通過AJAX獲取,這種行爲對我來說並不奇怪。也不奇怪的是,使用輸出緩存屬性並沒有解決問題,因爲它是IE,而不是服務器,它正在進行緩存。你需要做的是告訴IE不要緩存請求,通過在HTTP中設置適當的頭文件。下面是我們如何做到這一點:

[CacheControl(HttpCacheability.NoCache), HttpGet] 
    public JsonResult DoStuff() 
    { 
     //... 
    } 

public class CacheControlAttribute : ActionFilterAttribute 
{ 
    public CacheControlAttribute(HttpCacheability cacheability) 
    { 
     this._cacheability = cacheability; 
    } 

    private HttpCacheability _cacheability; 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(_cacheability); 
    } 
} 
+0

感謝這個,奇怪的是這個系統在升級到候選版本之前工作正常。我已經實現了你的自定義屬性,但不幸的是我仍然有同樣的問題。 – 2010-01-08 14:41:52

+0

仔細觀察(1)IE正在發送的標題和(2)響應中的標題。你可以使用Fiddler來做到這一點。如果你看到IE沒有提出請求,那肯定是IE,而不是服務器,進行緩存,你需要在* initial *頁面加載(服務器實際響應的那個頁面)製作頭文件,緩存它。 – 2010-01-08 14:46:49

+0

我已將nocache過濾器添加到整個控制器,並且它在初始加載時(通過斷點檢查)絕對捕獲它。正如你所說的,這個請求並沒有被製作,而是來自緩存(根據調試欄)。我以http://cancharda.selfip.com:51331/Admin/Events打開我的開發箱,例如,如果單擊任一事件旁邊的鉛筆圖標,會打開一個對話框,方法是單擊保存問題變得明顯。感謝您的幫助,我想我會生氣! :) – 2010-01-08 14:54:44

0

我的2美分,至克雷格的偉大的解決方案 -

如果您使用的是用戶控制和使用「的RenderAction」

<% Html.RenderAction("UserList", "User"); %> 

渲染它,這個頁面通過GET和POST調用它,然後在屬性聲明中不提及請求方法。

[CacheControl(HttpCacheability.NoCache)] 

例如,我有一個搜索網格和一個搜索面板的頂部。我已經讓我的Grid成爲一個用戶控件,以便我可以通過AJAX(GET)調用&分頁,但當我按下「搜索」按鈕(POST)時,它也會被調用,所以我需要它們。