验证器.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 with "validateAllProperties"真正的

验证器。ValidateObject遍历所有验证属性,并在第一个失败时抛出ValidationException。我不认为可以通过这种方式获得所有失败属性的列表。

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

ValidateObject方法计算与对象类型相关联的每个ValidationAttribute属性。如果validateAllProperties设置为true,该方法将验证对象的属性值。

TryValidateObject方法手册继续:

它还检查是否提供了标有RequiredAttribute的每个属性。

我确认它总是检查所有必需的属性,而不考虑validateAllProperties。但是,如果您有,例如,一个范围验证属性,它只会在validateAllProperties为true时检查它(因为这是当它验证属性值时)。有点混乱,但正如你所注意到的,TryValidateObject显示了所有失败的属性,这也是我在我的项目中使用的。