2017-07-27 34 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