2017-07-27 32 views
1

我有一個控制器,其中類有MVC5 - 塊控制器的OutputCache採取具體行動

[OutputCache(NoStore = true, Duration = 0)] 

控制器有一個孩子的行動。這與OutputCache無關。有什麼辦法可以告訴這個動作不要使用類的值?

替代方法似乎是設置所有非子操作的屬性,或者爲子操作創建單獨的控制器。

我很高興地在子動作上保持相同的緩存設置,除了子動作不支持NoStore,所以你得到一個錯誤。 [OutputCache(Duration=0)]也是無效的。

爲了解決沒有緩存是默認設置的問題,那麼爲什麼要把它設置在第一位呢?這將客戶端收到的標題從Cache-Control: private更改爲

Cache-Control: private, no-store, max-age=0 
Pragma: no-cache 

I.e.一致的用戶代理不會在本地緩存。請注意,這是針對有人可能會丟失其接入設備的Intranet站點,而不是Internet網站。

+0

我想你回答了你的問題,把一個屬性放在孩子身上或者移動它 –

回答

2

OutputCache是一個可繼承的屬性。這意味着您可以在控制器上設置時通過簡單地向您的某個操作添加一些不同的內容來覆蓋它的行爲。例如:

[OutputCache(Duration = 3600)] 
public class MyController : Controller 
{ 
    [OutputCache(Duration = 60)] 
    public ActionResult Foo() 
    { 
     return View(); 
    } 

    public ActionResult Bar() 
    { 
     return View(); 
    } 
} 

Bar動作將被緩存用於基於所述控制器級設定1小時,同時Foo將被緩存只是1分鐘。

這就是說,我不確定你要在這裏做什麼。有效地使用NoStore = true, Duration = 0會禁用緩存,因此您並不需要對該操作進行任何操作,因爲控制器已經指定內部沒有內容會被緩存。從邏輯上講,你寧願添加OutputCache到你想要緩存的那個控制器中的動作,但是那時在控制器級別禁用緩存是沒有意義的:這實際上是默認的。

+0

我很高興地將緩存設置保留在子動作中。麻煩的是你得到一個ChildActionOnly不支持NoStore的錯誤。我已經更新了這個問題來反映這一點。另外,如果您只設置Duration = 0,那也是無效的。 – Laurence

+0

我還爲這個問題添加了一些內容,爲什麼我首先設置了這一點。它會更改客戶端收到的緩存標頭。 – Laurence