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
这意味着不显眼的插件现在可以正确处理具有嵌套属性的表单