考虑以下控制器动作签名:
[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 ”中摘录了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();
}
}
然后可以在控制器中使用它:
[HttpGet]
[MyValidation]
public IEnumerable<Whatever> Get(DateTime from, DateTime to)
{
// Here ModelState.IsValid is true
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句