假设我有两个简单的类:
public class CustomerDetails
{
[Required]
public string Address
{
get;
set;
}
}
public class Customer
{
public Customer()
{
Details = new CustomerDetails();
}
[Required]
public string Name
{
get;
set;
}
public CustomerDetails Details
{
get;
private set;
}
}
当我尝试通过这种方式在控制台应用程序中手动验证Customer类时:
var customer = new Customer() { Name = "Conrad" };
var context = new ValidationContext(customer, null, null);
var results = new List<ValidationResult>();
Validator.TryValidateObject(customer, context, true);
然后,即使我选择验证客户实例的所有属性,验证器也仅验证客户实例的Name属性,而不验证Details的Address属性。
这是设计使然还是我在这里缺少什么?而且,如果这是设计使然,那么是否存在一种健壮的方法来手动验证装饰有验证属性(包括嵌套类型)的完整对象图,而不是手动对整个对象图使用验证器?
请注意,这是在控制台应用程序而不是ASP.NET MVC应用程序中测试的。
亲切的问候。
最佳答案
我有几乎相同的问题,但是有嵌套对象的集合。我能够通过在容器类上实现IValidatableObject
来解决它。就您而言,这稍微容易些。像这样:
public class Customer : IValidatableObject
{
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;
}
}
希望这可以帮助。
关于validation - 手动使用数据注释验证和对象图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6938877/