Asp.net mvc ASP.NET MVC 4在复杂模型上不引人注目的验证

Asp.net mvc ASP.NET MVC 4在复杂模型上不引人注目的验证,asp.net-mvc,asp.net-mvc-4,jquery-validate,unobtrusive-validation,data-annotations,Asp.net Mvc,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,Data Annotations,好的,我有一个模型,看起来像: public class CustomerViewModel { public string Password { get; set; } } public class CustomerAddViewModel { public CustomerViewModel Customer { get; set; } [System.ComponentModel.DataAnnotations.Compare("Customer.Password", Err

好的,我有一个模型,看起来像:

public class CustomerViewModel {
  public string Password { get; set; }
}

public class CustomerAddViewModel {
  public CustomerViewModel Customer { get; set; }
  [System.ComponentModel.DataAnnotations.Compare("Customer.Password", ErrorMessage = "The confirm password should match")]
  public string ConfirmPassword { get; set; }
}
我在验证时收到错误消息“找不到名为Customer.Password的属性”

我发现了,但它不适用,因为在最新版本的validation.unobtrusive中,代码如下所示:

element = $(options.form).find(":input[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
public class CustomerAddViewModel {
  public CustomerViewModel Customer { get; set; }
  public string Password 
  {
     get
     {
        return this.Customer.Password;
     }
  }
  [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "The confirm password should match")]
  public string ConfirmPassword { get; set; }
}
其中,escapeAttributeValue处理所有有效的特殊字符

我尝试改用System.Web.Mvc.Compare,但在渲染视图时会导致错误


有什么想法吗?

原因很简单,属性“Customer.Password”不存在。您可以这样定义ViewModel:

element = $(options.form).find(":input[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
public class CustomerAddViewModel {
  public CustomerViewModel Customer { get; set; }
  public string Password 
  {
     get
     {
        return this.Customer.Password;
     }
  }
  [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "The confirm password should match")]
  public string ConfirmPassword { get; set; }
}
正确的“MVC”方法是避免视图模型中有子对象。视图模型用于提供特定操作所需的最低信息。注册/创建客户所需的所有信息都应该在视图模型中,当您提交包含有效信息的表单时,接收该信息的操作(或数据层中的某个位置,取决于您的结构)将基于该视图模型创建客户对象


当然,您可能仍然可以绕过我刚才所说的内容,但您拒绝写这些额外的行的时间越长,就越难走出您正在挖掘的漏洞。

因为没有Customer.Password属性,所以您会遇到错误。有一个Password属性,但它位于不同的Classic中。真的那么简单吗?我认为验证是“聪明”的,足以遍历对象层次结构。不,CompareAttribute只在当前模型类中查找具有给定名称的属性。谢谢……我真的觉得自己在某个地方犯了一些小错误,但实际上我的想法是错的。感谢您的简单修复!这只适用于服务器端,它不会比较客户端的密码,请突出显示一下好吗?@AniShroff,这应该也适用于客户端,使用jQuery验证。您不必做任何事情,只需确保客户端验证已启用,并且您正在视图中引用验证脚本。我完全理解这一点。如果它完全在我的控制之下,那就是我要走的路线,但不幸的是,他们决定不创建额外的视图特定模型。好的方面是,这个应用程序稍后会被重新编写,我会去做的!