使用注释和IValidatableObject进行递归validation

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

我发现以下post很有用

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

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

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 Validate(ValidationContext validationContext) { var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items); var results = new List(); Validator.TryValidateObject(this.Details, context, results); return results; } } 

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

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

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

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

请参阅此答案: 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(); Validator.TryValidateObject(value, context, results); // TODO: Wrap or parse multiple ValidationResult's into one ValidationResult return result; }