【问题标题】:ASP.NET Core Custom Validation Attribute Not FiringASP.NET Core 自定义验证属性未触发
【发布时间】:2019-03-13 17:58:58
【问题描述】:

我在 API 控制器中有一个 GET 方法。我希望使用自定义验证属性验证该方法,如下所示。但是由于某些原因它没有被解雇。

[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");
        }
    }

我不确定我在这里缺少什么。

-艾伦-

【问题讨论】:

  • 为什么你认为这段代码应该被解雇?你有一些过滤器,检查这个属性?你读过文档吗?此外,这应该命名为CheckValidRouteAttribute
  • 这个名字我肯定会检查。将其移至授权上方,以确保不会妨碍您。 docs.microsoft.com/en-us/aspnet/core/mvc/models/… 用于文档
  • @StevenMayer,感谢您的链接,但标题“ASP.NET Core MVC 中的模型验证”不会打扰您?
  • 我阅读了 Net Core 自定义属性,他的代码就是为此,所以提供了我用于此的代码。我自己可能会考虑使用之前运行的不同过滤器而不是自定义验证属性:docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…

标签: c# asp.net-core custom-attributes validationattribute


【解决方案1】:

您使用了错误的基类来实现您的属性。 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 对象执行检查。我把它作为练习留给你,因为我不知道你的确切要求:-)

将此属性应用于您的控制器方法后,OnActionExecuting 将在控制器方法被调用之前被调用,以便您进行验证。

你可以阅读更多关于 ActionFilters here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多