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

时间:2011-12-17 22:45:44

标签: c# asp.net-mvc validation

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

我发现以下帖子很有用

Using Data Annotations Validation Manually and Object Graphs

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

因此,类'atributes中存在错误,因此不会调用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;

}