我有一个控制器,班级有
[OutputCache(NoStore = true, Duration = 0)]
控制器有一个子操作。这与OutputCache无关。有没有办法告诉这个动作不要使用类值?
替代方案似乎是在所有非子操作上设置属性,或者为子操作创建单独的控制器。
我很高兴在子操作上保留相同的缓存设置,除了子操作不支持NoStore,因此您收到错误。 [OutputCache(Duration=0)]
也无效。
为了解决没有缓存是默认值的问题,那么为什么要首先设置它呢?这会将客户端从Cache-Control: private
收到的标头更改为
Cache-Control: private, no-store, max-age=0
Pragma: no-cache
即。符合要求的用户代理不会在本地缓存它。请注意,这适用于某人可能会丢失其访问设备的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
添加到您 想要缓存的控制器中的操作,但此时,在控制器级别禁用缓存是没有意义的:'无论如何都是有效的默认值。
答案 1 :(得分:0)
我也有类似情况。就我而言,我正在尝试将OutputCache
属性注册为全局过滤器,并且当View包含子操作时,它给了我同样的错误。我最终要做的是创建一个继承OutputCacheAttribute
的自定义属性。并跳过所有用ChildActionOnly
属性修饰的动作。假设您所有的孩子动作都装饰有这样的装饰。
public class NoCacheAttribute : OutputCacheAttribute
{
public NoCacheAttribute()
{
base.NoStore = true;
base.Duration = 0;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(ChildActionOnlyAttribute), false).Any()) return;
base.OnActionExecuting(filterContext);
}
}
更新:
更好的是,使用filterContext.IsChildAction
来检测孩子
public class NoCacheAttribute : OutputCacheAttribute
{
public NoCacheAttribute()
{
base.NoStore = true;
base.Duration = 0;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.IsChildAction) return;
base.OnActionExecuting(filterContext);
}
}