复杂表单验证(禁用子对象属性的验证)

时间:2012-04-22 19:15:11

标签: .net asp.net-mvc validation

在我的业务领域中,“用户”实体与单个“人”实体相关联(因此用户实例包含安全/登录信息,但是Person实体包含该人的人工联系信息)。

我的ViewModel如下所示:

class UserViewModel {
    [Required]
    public String UserName { get; set; }

    public Int64 PersonId { get; set; }
    public PersonViewModel Person { get; set; }

    public Boolean PersonViewModelIsNew { get; set; }
}

class PersonViewModel {
    [Required]
    public String FirstName;
    [Required]
    public String LastName;
    // etc
}

网页允许访问者编辑用户,以便他们可以用全新的Person实例或从数据库中提取的现有Person替换用户的Person信息。

附件是表格的截图:

Screenshot of the form

这个想法是,如果选择“Another employee”单选按钮(映射到“UserViewModel.PersonViewModelIsNew”属性),则将禁用“UserViewModel.Person”成员的验证。

然而,ASP.NET MVC没有像WebForms这样的验证组的概念,那么如何控制这样的验证呢?

2 个答案:

答案 0 :(得分:1)

我认为这更像是一个绑定问题,而不是验证问题(因为验证在绑定后发生)。

我发现一个解决方案是使用[Bind(Exclude =“Person”)]标记ViewModel,并在我的Action方法中执行此操作:

if( model.PersonViewModelIsNew ) {
    TryUpdateModel( model.Person, "Person" );
}

if( !ModelState.IsValid ) return View( model );

// Update DB here

这种方法目前似乎有效。

答案 1 :(得分:0)

MVC Foolproof Validation project添加了一些很好的验证规则,涵盖了ASP.NET MVC中包含的验证器未涵盖的一些情况,例如RequiredIfTrue Validation属性,它看起来与您需要的类似。

当然,如果您有特殊要求,可以编写自定义验证规则,通过继承ValidationAttribute类来创建自定义验证属性,您也可以选择在客户端上提供验证。