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
}