【问题标题】:ASP.NET MVC 4 Unobtrusive validation broken on complex modelsASP.NET MVC 4 不显眼的验证在复杂模型上被破坏
【发布时间】:2013-08-06 18:07:11
【问题描述】:

好的,所以我有一个看起来像这样的模型:

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 的属性”。

我找到了this SO Question,但它不适用,因为在最新版本的validation.unobtrusive 中,代码如下所示:

element = $(options.form).find(":input[name='" + escapeAttributeValue(fullOtherName) + "']")[0];

其中 escapeAttributeValue 处理所有有效的特殊字符。

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

有什么想法吗?

【问题讨论】:

  • 您收到错误是因为没有 Customer.Password 属性。有一个 Password 属性,但它位于不同的类中

标签: asp.net-mvc asp.net-mvc-4 jquery-validate unobtrusive-validation data-annotations


【解决方案1】:

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

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; }
}

【讨论】:

  • 真的这么简单吗?我认为验证足够“聪明”,可以遍历对象层次结构。
  • 否,CompareAttribute 仅在当前 Model 类中查找具有给定名称的属性。
  • 谢谢...我真的很自责,以为我在某个地方有一些小错字,而实际上只是我的想法错了。感谢您的简单修复!
  • 这有效,但只适用于服务器端,它不比较客户端的密码,你能强调一下吗?
  • @AniShroff,这应该也可以在客户端使用 jQuery 验证。您无需执行任何操作,只需确保启用了客户端验证,并且您在 View 中引用了验证脚本。
【解决方案2】:

正确的“MVC”方式是避免在视图模型中包含子对象。视图模型用于提供特定操作所需的最少信息。您注册/创建客户所需的所有信息都应该在您的视图模型中,并且当您使用有效信息提交表单时,接收它的操作(或根据您的结构在数据层中的某个位置)将创建一个客户基于该视图模型的对象。

当然你可能仍然可以绕过我刚才所说的,但是你拒绝写那些额外的行的时间越长,就越难摆脱你正在挖掘的洞。

【讨论】:

  • 这个我完全明白。如果它完全在我的控制之下,这就是我要走的路线,但不幸的是,他们决定不创建额外的视图特定模型。从好的方面来说,该应用程序将在稍后重新编写,我会这样做!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多