c# - ASP.NET Core 自定义验证属性未触发

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

我在 API Controller 中有一个 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
        }
    }

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

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

-艾伦-

最佳答案

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

在您的情况下,您想实现 ActionFilter ,它可以应用于 Controller 方法,并且可以在调用方法之前执行验证。你的一个例子是:

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 执行检查的方法目的。我把它留给你作为练习,因为我不知道你的确切要求:-)

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

您可以阅读更多关于 ActionFilters here

关于c# - ASP.NET Core 自定义验证属性未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52712849/

相关文章:

linux - 从 appsettings.json 加载 SSL 证书

asp.net-core - Font Awesome 图标未显示在 ASP.NET CORE MVC 项目中

c# - 使用 Twilio .netcore Blazor 服务器端发送短信通知

php - DataTables:通过ajax加载数据时为行添加自定义属性

c# - 从配置文件中读取属性参数值

c# - XNA,遮挡剔除和碰撞检测

c# - 从代码构建 visual studio 解决方案

c# - 只能通过单击使用的按钮。没有进入,没有返回。只需点击一下