在我的业务领域中,“用户”实体与单个“人”实体相关联(因此用户实例包含安全/登录信息,但是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信息。
附件是表格的截图:
这个想法是,如果选择“Another employee”单选按钮(映射到“UserViewModel.PersonViewModelIsNew”属性),则将禁用“UserViewModel.Person”成员的验证。
然而,ASP.NET MVC没有像WebForms这样的验证组的概念,那么如何控制这样的验证呢?
答案 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类来创建自定义验证属性,您也可以选择在客户端上提供验证。