在全局注册操作过滤器时跳过特定操作的过滤器

时间:2012-10-15 07:35:37

标签: c# asp.net-mvc-4 asp.net-web-api

我写了我自己的动作过滤器并在global.asax文件中注册,现在我的问题是我如何跳过 针对特定操作的此过滤器,我通过为DontValidate创建自定义属性来考虑这一点 并将其放在我想要跳过验证的操作上,并在我的操作过滤器代码中,我将提出一个条件,如果该操作包含 DontValidate属性然后跳过验证。所以目前我还没有得到如何 实施它:

下面的代码是我的验证操作过滤器

   public class ValidationActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext context)
        {
            if (context.Request.Method.ToString() == "OPTIONS") return;
            //bool dontValidate =  context.ActionDescriptor. // here im stuck how to do
            var modelState = context.ModelState;
            if (!modelState.IsValid)
            {
                JsonValue errors = new JsonObject();
                foreach (var key in modelState.Keys)
                {
                    // some stuff
                }

                context.Response  = context.Request.CreateResponse<JsonValue>(HttpStatusCode.BadRequest, errors);
            }
        }
    }

1 个答案:

答案 0 :(得分:25)

您可以从上下文的ActionDescriptor属性获取用于装饰控制器操作的属性列表:

public class ValidationActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext context)
    {
        if (context.ActionDescriptor.GetCustomAttributes<DontValidateAttribute>().Any())
        {
            // The controller action is decorated with the [DontValidate]
            // custom attribute => don't do anything.
            return;
        }

        if (context.Request.Method.ToString() == "OPTIONS") return;
        var modelState = context.ModelState;
        if (!modelState.IsValid)
        {
            JsonValue errors = new JsonObject();
            foreach (var key in modelState.Keys)
            {
                // some stuff
            }

            context.Response = context.Request.CreateResponse<JsonValue>(HttpStatusCode.BadRequest, errors);
        }
    }
}
相关问题