2011-12-17 161 views
9

我想验证使用注释和一些自定义代码的嵌套对象(不是MVC senss中的模型)。使用注释和IValidatableObject递归验证

我发现下面的帖子有用

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

不过,我有一个获得所有验证错误的问题,设置为true validateAllProperties调用TryValidateObject时也是如此。

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

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

是否有任何修改我可以让例程来获取所有错误显示?

回答

5

看到这个答案:https://stackoverflow.com/a/3400627/724944

因此,有你的类atributes错误,因此验证方法不会被调用。 我建议使用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; 

} 
+0

好吧,如果我理解正确的话,“validateAllProperties”只会影响注解性,不是一个独立的验证程序?但我确实尝试实施你的日常工作,但是我对你作为TODO留下的问题存在问题。由于ValidateRelatedObject返回单个ValidationResult(对于单个注释属性),我怎样才能将潜在错误列表(从嵌套对象中)推送到容器对象中的潜在错误列表中?原来的例子在这方面似乎更有希望,因为它返回了一份清单。非常感谢您的帮助! – goorj

+0

在我的项目中,我简单地枚举了所有ValidationResult的和合并错误到一个字符串中,用新行分隔。后来,当我需要使用它时,我只是将错误分成多行。你也可以考虑创建一个像MultiValidationResult这样的类,它将存储实际的ValidationResult并显示连接错误。 – surfen