繁体   English   中英

.NET Core Web API模型验证

[英].NET Core Web API model validation

我有一种通常看起来像的方法

    public IActionResult SomeAction(Guid id, [FromBody] Request request)
    {
       //bunch of other stuff left out
       AnotherObject obj = Mapper.Map(request);
      if (ModelState.IsValid) {//only validation errors on the request object are found
//obj validation errors are ignored
}
    }

在Request类中,我使用DataAnnotations来测试模型状态,并且它们工作正常。 但是,在AnotherObject内部,我也使用DataAnnotations,并且当我在此函数中测试ModelState时,.NET会从Request对象中看到验证错误,但在映射对象中却看不到。

该终结点的调用者不需要了解AnotherObject,也不需要。 有没有办法让.NET尊重对在控制器动作内部创建但未传递的对象的验证?

您可以使用Validator对象手动测试对象:

var obj = Mapper.Map(request);
var context = new ValidationContext(obj, serviceProvider: null, items: null);
var results = new List<ValidationResult>();

var isValid = Validator.TryValidateObject(obj, context, results);

有关更多信息,请参见此简短教程

请注意,此操作不是递归的,具体取决于AnotherObject的复杂性,您可能需要使用Reflection自己遍历该对象。

ModelState将JSON转换为Type Request时,它将验证模型。 因此,ModelState针对空值和不匹配类型进行验证。 当您将request映射到obj不会发生对ModelState的调用。

因此,使用:

if (ModelState.IsValid) {
  AnotherObject obj = Mapper.Map(request);
}

映射时验证模型...您真的不需要两个ModelState验证器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM