【问题标题】:How can I validate multiple action parameters with ValidationAttribute in ASP.NET Core 3.0如何在 ASP.NET Core 3.0 中使用 ValidationAttribute 验证多个操作参数
【发布时间】:2020-05-20 05:33:07
【问题描述】:

考虑以下控制器操作签名:

[HttpGet]
public IEnumerable<Whatever> Get(DateTime from, DateTime to)

或者

[HttpGet]
public Whatever Get(int amount, SomeUnit unit)

我希望能够对调用者提供的参数进行验证。在这两种情况下,第一个参数中作为有效输入传递的内容取决于第二个参数的值。

到目前为止,我还没有找到解释或示例说明如何使用 ASP.NET Core 3.0 中的验证属性来实现这一点

我看到例如CustomValidationAttribute 允许在方法上使用它。我可以给它一个 IsValid 将委托给它并提供对象和验证上下文的方法:

IsValid(Object, ValidationContext)

我检查了 IsValid 和 ValidationContext 的文档,但找不到任何关于如何访问传递给已验证操作的参数的提示。

在谷歌搜索提示时,我发现了“Pro ASP.NET Web API”HTTP Web Services in ASP.NET”的摘录,它们实现了类似的东西。但摘录在显示代码之前就结束了,我没有那本书(没有'找不到对应的书,但在 ASP.NET Core 上)。

【问题讨论】:

    标签: c# asp.net validation asp.net-core asp.net-core-webapi


    【解决方案1】:

    CustomValidationAttribute 用于属性和参数。对于动作验证,您应该编写自己的过滤器。这是一个例子:

    public class MyValidationAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if(context.ModelState.IsValid)
            {
                var dateFrom = (DateTime)context.ActionArguments["from"];
                var dateTo = (DateTime)context.ActionArguments["to"];
    
                if(dateFrom <= dateTo)
                {
                    // continue the flow in pipeline
                    return;
                }
            }
    
            context.Result = new BadRequestResult();
        }
    }
    

    然后你就可以在你的控制器中使用它了:

    [HttpGet]
    [MyValidation]
    public IEnumerable<Whatever> Get(DateTime from, DateTime to)
    {
        // Here ModelState.IsValid is true
    }
    

    【讨论】:

    • 感谢您的回答。我认为这会起作用,但我希望 asp.net core 能提供更优雅的解决方案。你看,我已经有了 ActionFilter(全局应用于所有控制器),它检查 ModelState 是否无效,然后返回我的自定义错误响应以及所有验证错误。使用您的方法,我不确定我对哪个动作过滤器首先起作用有多少控制权。如果模型上已经存在一些验证错误,并且我的错误返回过滤器将首先起作用,我将向调用者返回可能不完整的验证错误数量。
    • @Emil 你可以设置过滤器的 Order 属性
    • 有没有办法使用现有的验证器? [StringLength(1)] 等?
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 2023-03-17
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多