为整个控制器指定[HttpGet],[HttpPost]或[AcceptVerbs]

时间:2014-06-05 17:16:36

标签: c# asp.net asp.net-mvc asp.net-mvc-routing

可以为ASP.NET MVC中的整个Controller指定许多操作过滤器,从而将其应用于控制器中的所有操作。例如:

[Authorize]
public class MyController : Controller
{
    // ....
}

表示[Authorize]适用于控制器中的所有操作,非常方便。

但是当我尝试在控制器上放置[HttpGet][HttpPost][AcceptVerbs(...)]时,编译器会抱怨该属性仅适用于方法(这是正确的,因为它们已定义[AttributeUsage]仅指向方法。)

如果我想将控制器中的所有操作仅限制为POST动词怎么办?

我的问题是:

  • 在没有编写自己的属性的情况下,框架中是否有任何方法可以实现这一目标?
  • 为什么这些属性是以这种方式实现的,而不是允许它们在控制器上?

2 个答案:

答案 0 :(得分:0)

HttpGet和HttpPost继承自ActionMethodSelectorAttribute类,并且仅适用于方法。我认为你需要创建自己的属性。

答案 1 :(得分:0)

解决此问题的自定义属性:

    public sealed class AllowedMethodsAttribute : ActionFilterAttribute
    {
        private readonly string[] methods;

        public AllowedMethodsAttribute(params string[] methods) => this.methods = methods.Select(r => r.Trim().ToUpperInvariant()).ToArray();

        public override void OnActionExecuting(ActionExecutingContext actionContext)
        {
            if (!methods.Contains(actionContext.HttpContext.Request.Method))
            {
                actionContext.Result = new StatusCodeResult(405);
            }
        }
    }

用法:

[AllowedMethods("GET", "PATCH")]