验证器.ValidateObject with "validateAllProperties"真正的
本文关键字:quot validateAllProperties ValidateObject 验证 with | 更新日期: 2023-09-27 17:49:43
我有一个自定义类(简单点):
using System;
using System.ComponentModel.DataAnnotations;
public class MyClass {
[Required]
public string Title { get; set;}
[Required]
public string Description { get; set;}
}
我想验证这个对象,并得到一个异常,一切都不正确。
如果我这样做:
void Validate() {
var objectToValidate = new MyClass { }; // Both properties are null at this time
var ctx = new ValidationContext(objectToValidate, null, null);
Validator.ValidateObject(objectToValidate, ctx, true);
}
抛出ValidationException,但它只显示第一个错误,即使我将validateAllProperties
参数指定为true。
如果我重构了一点代码:
void Validate() {
var objectToValidate = new MyClass { }; // Both properties are null at this time
var ctx = new ValidationContext(objectToValidate, null, null);
var errors = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(objectToValidate, ctx, errors, true);
if(!isValid) {
throw new AggregateException(
errors.Select((e)=>new ValidationException(e.ErrorMessage)
);
}
}
我可以得到所有的错误。
为什么第一个代码片段按预期工作?我做错什么了吗?
验证器。ValidateObject遍历所有验证属性,并在第一个失败时抛出ValidationException。我不认为可以通过这种方式获得所有失败属性的列表。
MSDN文档这里有点令人困惑,它说:
ValidateObject方法计算与对象类型相关联的每个ValidationAttribute属性。如果validateAllProperties设置为true,该方法将验证对象的属性值。
TryValidateObject方法手册继续:
它还检查是否提供了标有RequiredAttribute的每个属性。
我确认它总是检查所有必需的属性,而不考虑validateAllProperties。但是,如果您有,例如,一个范围验证属性,它只会在validateAllProperties为true时检查它(因为这是当它验证属性值时)。有点混乱,但正如你所注意到的,TryValidateObject显示了所有失败的属性,这也是我在我的项目中使用的。