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

标签 validation data-annotations manual

假设我有两个简单的类:

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/

相关文章:

.net - 客户端表单验证不适用于使用 MetadataType 的 jquery 向导

perl - 如何让 Getopt::Long + pod2usage 工作?

html - Play Framework 中的客户端表单验证

php - 验证用户输入或����������

javascript - angularjs 形成 'has-success' 标记,无需输入任何数据

angularjs - 如何为较大的表单部分禁用 ng-required 验证

asp.net-mvc-3 - MVC 模型验证 w/DataAnnotations -- 有什么方法可以使 ICollection 成为必需的?

validation - 本地化 MVC3 验证消息

Android:无需重新启动 Activity 的手动屏幕方向?

hyperlink - 直接获取Youtube下载链接