我有一个通常看起来像
的方法 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尊重对在控制器动作内部创建但未传入的对象的验证?
答案 0 :(得分:3)
您可以使用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);
有关更多信息,请参见this short tutorial。
请注意,此操作不是递归的,具体取决于AnotherObject的复杂性,您可能需要使用Reflection自己遍历该对象。
答案 1 :(得分:1)
ModelState
在将JSON转换为类型请求时验证模型。因此,ModelState针对空值和不匹配类型进行验证。当您将request
映射到obj
时,不会发生对ModelState的调用。
因此,使用:
if (ModelState.IsValid) {
AnotherObject obj = Mapper.Map(request);
}
在映射时验证模型...您真的不需要两个ModelState验证器