C# Validator.ValidateObject带有“Validator”;“验证所有财产”;若为true,则在出现第一个错误时停止
我有一个自定义类(简单来说): 我想验证这个对象,并得到一个异常,所有内容都不正确 如果我这样做:C# Validator.ValidateObject带有“Validator”;“验证所有财产”;若为true,则在出现第一个错误时停止,c#,validation,c#-4.0,C#,Validation,C# 4.0,我有一个自定义类(简单来说): 我想验证这个对象,并得到一个异常,所有内容都不正确 如果我这样做: void Validate() { var objectToValidate = new MyClass { }; // Both properties are null at this time var ctx = new ValidationContext(objectToValidate, null, null); Validator.ValidateObject(o
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)
);
}
}
void Validate(){
var objectToValidate=new MyClass{};//此时这两个属性都为null
var ctx=新的ValidationContext(objectToValidate,null,null);
var errors=新列表();
var isValid=Validator.TryValidateObject(objectToValidate,ctx,errors,true);
如果(!isValid){
抛出新的AggregateException(
错误。选择((e)=>new ValidationException(e.ErrorMessage)
);
}
}
事实上,我可以有我所有的错误
为什么第一个代码段按预期工作?我做错了什么吗?Validator.ValidateObject检查所有验证属性,并为第一个失败的代码段抛出ValidationException。我认为无法获得所有以这种方式失败的属性的列表 MSDN文档在这里有点混乱,它说: ValidateObject方法计算与对象类型关联的每个ValidationAttribute属性。如果validateAllProperties设置为true,则该方法验证对象的属性值 TryValidateObject方法手册继续: 它还检查是否提供了标记为RequiredAttribute的每个属性
我确认它总是检查所有必需的属性,而不管ValidateAllProperty如何。但是,例如,如果您有一个范围验证属性,它将仅在ValidateAllProperty为true时检查它(因为这是当它验证属性值时)。有点混乱,但正如您所注意到的,TryValidateObject显示所有失败的属性,这也是我在项目中使用的属性。感谢您的解释…它实际上很混乱,参数名称不明确。我将保留聚合异常…这对我来说不是什么大问题:)Evgenii是正确的。您无法通过
验证程序.ValidateObject
获取所有无效属性的列表。它只返回第一个失败的。查看源代码仅供将来阅读,在较新版本的DataAnnotations中,Validator.TryValidateObject有一个重载,它接受一个ICollection
,如果提供了任何属性,它将验证每个属性并为我们将所有错误收集到该集合中。感谢您的代码。ValidationErrors类应该是ValidationResult。
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)
);
}
}