使用注释和IValidatableObject进行递归验证

goo*_*orj 9 c# validation asp.net-mvc

我试图使用注释和一些自定义代码验证嵌套对象(不是MVC senss中的模型).

我发现以下帖子很有用

使用数据注释验证手动和对象图

正如在答案中所建议的,我在容器类中创建了一个额外的例程来验证嵌套对象.这是我修改过的测试代码

public class Customer : IValidatableObject
{
    public Customer()
    {
        Details = new CustomerDetails();
    }

    [Required]
    [MaxLength(2)]
    public string Name
    {
        get;
        set;
    }

    public CustomerDetails Details
    {
        get;
        private set;
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items);
        var results = new List<ValidationResult>();
        Validator.TryValidateObject(this.Details, context, results);
        return results;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,即使在将validateAllProperties设置为true的情况下调用TryValidateObject时,我也无法获得所有验证错误.

        var context = new ValidationContext(cs, null, null);
        var results = new List<ValidationResult>();
        Validator.TryValidateObject(cs, context, results,true);
Run Code Online (Sandbox Code Playgroud)

如果容器中有任何错误,则只显示这些错误.仅当容器对象中没有错误时,才会显示嵌套对象中的错误.我怀疑它与Validate rouine有关,返回一个完整的列表,而且无法从容器中添加(现有)列表(?)

我可以对常规进行任何修改以显示所有错误吗?

sur*_*fen 5

请参阅此答案:https://stackoverflow.com/a/3400627/724944

因此,类的属性中存在错误,因此不会调用Validate方法.我建议像这样使用CustomValidationAttribute:

[CustomValidation(typeof(Customer), "ValidateRelatedObject")]
public CustomerDetails Details
{
    get;
    private set;
}

public static ValidationResult ValidateRelatedObject(object value, ValidationContext context)
{
    var context = new ValidationContext(value, validationContext.ServiceContainer, validationContext.Items);
    var results = new List<ValidationResult>();
    Validator.TryValidateObject(value, context, results);

    // TODO: Wrap or parse multiple ValidationResult's into one ValidationResult

    return result;

}
Run Code Online (Sandbox Code Playgroud)