c# - 如何在 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 上)。
解决方案
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
}
推荐阅读
- microdata - 这种结构化数据的使用与 JSON-LD 不兼容吗?
- javascript - 在 NetSuite 中提交时调用 Web 服务
- java - 如何修复:令牌上的语法错误、错误的构造错误
- c# - 在 Unity 中获取多个 GameObjects 之间的中心点
- bash - 在 bash 上处理 $'\346' 等特殊字符
- authentication - Nancy 503 错误切换到 OWIN 自主机
- html - iframe 为空时隐藏 div
- css - 我的 Navbar.css 没有改变我的 Navbar.jsx
- javascript - Firebase,orderByChild 没有排序
- wordpress - wp-bakery 的位置和文件夹名称