C# 如何使用ASP.NET Core 3.0中的ValidationAttribute验证多个操作参数

C# 如何使用ASP.NET Core 3.0中的ValidationAttribute验证多个操作参数,c#,asp.net,validation,asp.net-core,asp.net-core-webapi,C#,Asp.net,Validation,Asp.net Core,Asp.net Core Webapi,考虑以下控制器操作签名: [HttpGet] public IEnumerable<Whatever> Get(DateTime from, DateTime to) 我希望能够对调用方提供的参数运行验证。在这两种情况下,第一个参数中作为有效输入传递的内容取决于第二个参数的值 到目前为止,我还没有找到ASP.NET Core 3.0中的验证属性如何实现这一点的解释或示例 例如,我看到它允许在方法上使用它。我可以给它一个IsValid将委托给并提供对象和验证上下文的方法: IsVal

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

[HttpGet]
public IEnumerable<Whatever> Get(DateTime from, DateTime to)
我希望能够对调用方提供的参数运行验证。在这两种情况下,第一个参数中作为有效输入传递的内容取决于第二个参数的值

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

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

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


在谷歌搜索提示时,我发现了“ASP.NET中的HTTP Web服务”中的一段摘录,它们在其中实现了类似的功能。但是,该摘录在代码显示之前结束,我没有这本书(在ASP.NET Core上没有找到相应的书).

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();
    }
}
公共类MyValidationAttribute:ActionFilterAttribute
{
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
if(context.ModelState.IsValid)
{
var dateFrom=(DateTime)context.ActionArguments[“from”];
var dateTo=(DateTime)context.ActionArguments[“到”];

如果(dateFrom)感谢您的回答。我知道这会起作用,但我希望asp.net core能提供一个更优雅的解决方案。您知道,我已经有了ActionFilter(全局应用于所有控制器)它检查ModelState是否无效,然后返回我的自定义错误响应和所有验证错误。使用您的方法,我不确定我对哪个操作筛选器首先执行有多大的控制权。如果模型上已经存在一些验证错误,并且我的错误返回筛选器将首先执行,我将返回可能的incom请向调用方提供验证错误的数目。@eml您可以设置筛选器的Order属性
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
}