DataAnnotations:recursionvalidation整个对象图

我有一个洒有DataAnnotation属性的对象图,其中对象的某些属性是本身具有validation属性的类,等等。

在以下情况下:

public class Employee { [Required] public string Name { get; set; } [Required] public Address Address { get; set; } } public class Address { [Required] public string Line1 { get; set; } public string Line2 { get; set; } [Required] public string Town { get; set; } [Required] public string PostalCode { get; set; } } 

如果我尝试validation一个没有PostalCode值的Employee Address ,那么我希望(并期望)有一个例外,但是我没有得到。 以下是我如何做到这一点:

 var employee = new Employee { Name = "Neil Barnwell", Address = new Address { Line1 = "My Road", Town = "My Town", PostalCode = "" // <- INVALID! } }; Validator.ValidateObject(employee, new ValidationContext(employee, null, null)); 

我还有哪些其他的select,以确保所有的属性recursionvalidation?

提前谢谢了。

我的回答太长了,所以我把它变成了博客文章:)

使用DataAnnotations进行recursionvalidation

该解决scheme为您提供了一种使用您现在使用的基本方法来实现recursionvalidation的方法。

这是selectjoin属性方法的替代方法。 我相信这将正确地遍历对象图并validation一切。

 public bool TryValidateObjectRecursive<T>(T obj, List<ValidationResult> results) { bool result = TryValidateObject(obj, results); var properties = obj.GetType().GetProperties().Where(prop => prop.CanRead && !prop.GetCustomAttributes(typeof(SkipRecursiveValidation), false).Any() && prop.GetIndexParameters().Length == 0).ToList(); foreach (var property in properties) { if (property.PropertyType == typeof(string) || property.PropertyType.IsValueType) continue; var value = obj.GetPropertyValue(property.Name); if (value == null) continue; var asEnumerable = value as IEnumerable; if (asEnumerable != null) { foreach (var enumObj in asEnumerable) { var nestedResults = new List<ValidationResult>(); if (!TryValidateObjectRecursive(enumObj, nestedResults)) { result = false; foreach (var validationResult in nestedResults) { PropertyInfo property1 = property; results.Add(new ValidationResult(validationResult.ErrorMessage, validationResult.MemberNames.Select(x => property1.Name + '.' + x))); } }; } } else { var nestedResults = new List<ValidationResult>(); if (!TryValidateObjectRecursive(value, nestedResults)) { result = false; foreach (var validationResult in nestedResults) { PropertyInfo property1 = property; results.Add(new ValidationResult(validationResult.ErrorMessage, validationResult.MemberNames.Select(x => property1.Name + '.' + x))); } } } } return result; 

}

大多数最新的代码: https : //github.com/reustmd/DataAnnotationsValidatorRecursive

包: https : //www.nuget.org/packages/DataAnnotationsValidator/

另外,我已经更新了这个解决scheme来处理循环对象图。 感谢您的反馈。