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)
        );
    }
}