jquery.validate似乎不适用于某些输入,其中name值包含一个点,即RegisterModel.Pssword

在我看来,如果我使用的模型只有标量,基本属性,即[RegisterModel],一切正常。 但是如果我使用一个视图模型类型,其中一个或多个属性设置为另一个.net复杂类型,比如[RegisterModelAndLogOnModel],则生成的HTML无法与jQueryvalidation插件一起正常工作。 使用jQuery 1.7.2它总是告诉我确认密码与密码不匹配,在jQuery 1.8.2中它只是简单地拒绝工作和错误。 我现在已经将问题指向RegisterModel.ConfirmPassword输入。

  

作品:

 
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password) @Html.ValidationMessageFor(m => m.Password)
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword) @Html.ValidationMessageFor(m => m.ConfirmPassword)

不起作用:

 
@Html.LabelFor(m => m.RegisterModel.Password)
@Html.PasswordFor(m => m.RegisterModel.Password) @Html.ValidationMessageFor(m => m.RegisterModel.Password)
@Html.LabelFor(m => m.RegisterModel.ConfirmPassword)
@Html.PasswordFor(m => m.RegisterModel.ConfirmPassword) @Html.ValidationMessageFor(m => m.RegisterModel.ConfirmPassword)

生成的HTML属性之一,即用于jQueryvalidation插件的data-val-equalto-other="*.Password"@Html.PasswordFor(m => m.RegisterModel.ConfirmPassword)并不好。 我使用helper方法生成HTML一次,复制整个事物并用静态html替换helper方法代码,将data-val-equalto-other="*.Password"更改为data-val-equalto-other="RegisterModel\.ConfirmPassword"

正如@Ryan Amies指出的那样,jQuery无法找到这样的属性

 $(form).find(":input[name='RegisterModel.Password']") 

它需要转义点(和一堆其他字符),即

 $(form).find(":input[name='RegisterModel\.Password']") 

作为MVC3模板项目的一部分出现的jquery.validate.unobtrusive.js版本存在一个错误,即找不到嵌套属性,因为它们没有被转义。 在使用NuGet提供的最新版本的Microsoft.jQuery.Unobtrusive.Validation包中修复了此错误。

此函数已添加到jquery.validate.unobtrusive.js

 function escapeAttributeValue(value) { // As mentioned on http://api.jquery.com/category/selectors/ return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); } 

这导致了

 escapeAttributeValue('this!thing') // this\!thing 

这意味着不显眼的插件现在可以正确处理具有嵌套属性的表单