首页 > 解决方案 > 如何在 ASP.NET Core 3.0 中使用 ValidationAttribute 验证多个操作参数

问题描述

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

[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.netvalidationasp.net-coreasp.net-core-webapi

解决方案


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
}

推荐阅读