【问题标题】:Using Data Annotations Validation Manually and Object Graphs手动使用数据注释验证和对象图
【发布时间】:2011-08-04 09:17:34
【问题描述】:

假设我有两个简单的类:

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

当我尝试以这种方式在控制台应用程序中手动验证客户类时:

var customer = new Customer() { Name = "Conrad" };
var context = new ValidationContext(customer, null, null);
var results = new List<ValidationResult>();
Validator.TryValidateObject(customer, context, true);

然后 - 即使我选择验证客户实例的所有属性 - Validator 也只验证客户实例的 Name 属性,而不是 Details 的 Address 属性。

这是设计使然还是我在这里遗漏了什么?此外,如果这是设计使然,那么是否有一种可靠的方法来手动验证装饰有验证属性的完整对象图,包括嵌套类型,而不是手动对整个对象图使用验证器?

请注意,这是在控制台应用程序而不是 ASP.NET MVC 应用程序中测试的。

亲切的问候。

【问题讨论】:

    标签: validation data-annotations manual


    【解决方案1】:

    我遇到了几乎相同的问题,但是嵌套对象的集合。我能够通过在容器类上实现 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;
        }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 这只是一层递归,必须手工手工制作。有没有什么方法可以自动遍历整个对象图,而不需要自定义Validate 实现?
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多