带有"validateAllProperties"的Validator.ValidateObject为true,在第一次出错时停止

Ste*_*e B 14 c# validation c#-4.0

我有一个自定义类(简单):

using System;
using System.ComponentModel.DataAnnotations;

public class MyClass {
    [Required]
    public string Title { get; set;}
    [Required]
    public string Description { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我想验证这个对象,并获得一个不正确的异常.

如果我做 :

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);
}
Run Code Online (Sandbox Code Playgroud)

抛出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)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我实际上可以解决所有错误.

为什么第一个代码段按预期工作?我做错了什么?

谢谢

Evg*_*nii 16

Validator.ValidateObject遍历所有验证属性,并针对第一个失败的抛出ValidationException.我不认为可以获得以这种方式失败的所有属性的列表.

这里的MSDN文档有点令人困惑,它说:

ValidateObject方法评估与对象类型关联的每个ValidationAttribute属性.如果validateAllProperties设置为true,则该方法验证对象的属性值.

TryValidateObject方法手册继续:

它还检查是否提供了标记为RequiredAttribute的每个属性.

我确认无论validateAllProperties如何,它总是检查所有必需属性.但是,如果你有一个Range验证属性,它只会在validateAllProperties为true时检查它(因为这是验证属性值的时候).有点令人困惑,但正如您所注意到的,TryValidateObject显示所有失败的属性,这也是我正在为我的项目使用的.