asp.net-mvc - 在 Controller 级别应用时如何禁用操作属性?

标签 asp.net-mvc attributes annotations

我有以下 Controller :

[NoCache]
public class AccountController : Controller
{
    [Authorize(Roles = "admin,useradmin")]
    public ActionResult GetUserEntitlementReport(int? userId = null)
    {
        var byteArray = GenerateUserEntitlementReportWorkbook(allResults);

        return File(byteArray,
                System.Net.Mime.MediaTypeNames.Application.Octet,
                "UserEntitlementReport.xls");
    }
}

public class NoCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var response = filterContext.HttpContext.Response; 
        response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        response.Cache.SetValidUntilExpires(false);
        response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        response.Cache.SetCacheability(HttpCacheability.NoCache);
        response.Cache.SetNoStore();
        base.OnResultExecuting(filterContext);
    }
}

如您所见, Controller 使用 [NoCache] 属性进行修饰。

有什么方法可以阻止此属性应用于 GetUserEntitlementReport 操作吗?

我知道我可以在 Controller 级别删除该属性,但这不是我最喜欢的解决方案,因为 Controller 包含许多其他操作,并且我不想将该属性独立地应用于每个操作。

最佳答案

您可以创建一个新属性,该属性可用于单个操作以选择退出在 Controller 级别指定的 NoCache。

[AttributeUsage(AttributeTargets.Class |
                AttributeTargets.Method,
                AllowMultiple = false,
                Inherited = true)]
public sealed class AllowCache : Attribute { }

使用[AllowCache]标记您想要允许缓存的任何操作

然后,在 NoCacheAttribute 的代码中,仅在 AllowCache 属性不存在时禁用缓存

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        var actionDescriptor = filterContext.ActionDescriptor;
        bool allowCaching = actionDescriptor.IsDefined(typeof(AllowCache), true) ||
            actionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowCache), true);

        if(!allowCaching)
        {
            //disable caching.
        }
    }
}

关于asp.net-mvc - 在 Controller 级别应用时如何禁用操作属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835258/

相关文章:

c# - Controller 中的自定义枚举类型作为参数 (ASP.NET MVC)

android - android :contentDescription ="@null" and tools:ignore ="ContentDescription"?有什么区别使用android :importantForAccessibility ="no"?

ruby-on-rails - rails ActiveRecord : Automatically Alias/Append Suffix?

java - 如何使用反射在运行时更改注释值?

c# - kendoui网格全选

jquery - MVC 4 自定义数据注解手动jquery验证调用

c# - 防止没有协议(protocol)的URL变成相对URL

c# - 如何从未(真正)加载的程序集中获取自定义属性

java - 如何将调用注释的类名和方法作为 "value"传递给注释属性

java - spring Aspect 注释无法解析为类型