2012-04-22 67 views
0

在我的业务领域中,“用户”实体与单个“Person”实体关联(因此User实例包含安全性/登录信息,但Person实体包含人的人体联系信息)。复杂表单验证(禁用对子对象属性的验证)

我的视图模型是这样的:

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实例,或现有人员代替用户的个人信息从数据库中拉出来。

附件是以下形式的屏幕截图:

Screenshot of the form

我们的想法是,如果“另一个雇员”单选按钮(映射到“UserViewModel.PersonViewModelIsNew”属性)被选中,那么的验证“UserViewModel.Person”成员将被禁用。

但是ASP.NET MVC没有像WebForms这样的验证组的概念,所以我该如何控制验证呢?

回答

1

我想这是一个比验证问题更具约束力的问题(因为验证发生在绑定之后)。

我找到了一个解决方案是,以纪念与视图模型[绑定(不包括=“人”),并在我的操作方法来做到这一点:

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

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

// Update DB here 

这种做法似乎现在的工作。

0

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

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