代码之家  ›  专栏  ›  技术社区  ›  Alan B

ASP.NET核心自定义验证属性未触发

  •  2
  • Alan B  · 技术社区  · 6 年前

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
        public class CheckValidRoute : ValidationAttribute
        {
            private readonly string _apiRoute;
            private readonly string _operation;
    
            public override bool RequiresValidationContext { get { return true; } }
    
            public CheckValidRoute(string apiRoute, string operation)
            {
                _apiRoute = apiRoute;
                _operation = operation;
            }
    
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
               //Validation logic here
            }
        }
    

    public class TestController : ControllerBase
        {
            [HttpGet("production/{movieId}/Test")]
            [ProducesResponseType(typeof(ResponseModel<string>), 200)]
            [Authorize(Policy = SecurityConstants.PseudofilmAuthorizationPolicy)]
            [CheckValidRoute("production/{movieId}/Test", "GET")]
            public async Task<ResponseModel<string>> TestGet(long movieId)
            {
                return ResponseModelHelper.BuildResponse("Success", $"production/{movieId}/Test", "Test");
            }
        }
    

    我不知道我在这里错过了什么。

    -艾伦-

    1 回复  |  直到 6 年前
        1
  •  5
  •   Simply Ged Saeed    6 年前

    使用错误的基类来实现属性。 ValidationAttribute 用于 Models 验证其属性值。这方面的一个例子是 Required 属性。

    ActionFilter

    public class CheckValidRouteAttribute : ActionFilterAttribute
    {
        private readonly string _apiRoute;
        private readonly string _operation;
    
        public CheckValidRouteAttribute(string apiRoute, string operation) : base()
        {
            _apiRoute = apiRoute;
            _operation = operation;
        }
    
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var request = context.HttpContext.Request;
    
            var method = request.Method;
    
            if (string.Compare(method, _operation, true) != 0)
            {
                context.Result = new BadRequestObjectResult("HttpMethod did not match");
            }
        }
    }
    

    OnActionExecuting HttpContext.Request 对象。我把它作为练习留给你,因为我不知道你的确切要求:-)

    OnAction正在执行 将在调用控制器方法之前调用,以便您可以执行验证。

    您可以阅读有关ActionFilters的更多信息 here