jquery.validate似乎不适用于名称值包含点的某些输入,即RegisterModel.Pssword

jquery.validate似乎不适用于名称值包含点的某些输入,即RegisterModel.Pssword,jquery,asp.net,asp.net-mvc,jquery-validate,unobtrusive-validation,Jquery,Asp.net,Asp.net Mvc,Jquery Validate,Unobtrusive Validation,在我看来,如果我使用的模型只有标量、基本属性,即[RegisterModel],那么一切都可以正常工作。但是如果我使用一个视图模型类型,其中一个或多个属性被设置为另一个.net复杂类型,比如[RegisterModelLandLogonModel],那么生成的HTML无法与jQuery验证插件正常工作。在jQuery1.7.2中,它总是告诉我确认密码与密码不匹配,而在jQuery1.8.2中,它只是简单地拒绝工作并出错。现在,我已经将问题指向RegisterModel.ConfirmPasswo

在我看来,如果我使用的模型只有标量、基本属性,即[RegisterModel],那么一切都可以正常工作。但是如果我使用一个视图模型类型,其中一个或多个属性被设置为另一个.net复杂类型,比如[RegisterModelLandLogonModel],那么生成的HTML无法与jQuery验证插件正常工作。在jQuery1.7.2中,它总是告诉我确认密码与密码不匹配,而在jQuery1.8.2中,它只是简单地拒绝工作并出错。现在,我已经将问题指向RegisterModel.ConfirmPassword输入

 <input name="RegisterModel.Password" id="RegisterModel_Password" type="password" data-val="true" data-val-required="The Password field is required." data-val-length-min="6" data-val-length-max="100" data-val-length="The Password must be at least 6 characters long.">

<input name="RegisterModel.ConfirmPassword" id="RegisterModel_ConfirmPassword" type="password" data-val="true" data-val-equalto-other="*.Password" data-val-equalto="The password and confirmation password do not match."/>

作品:

<div class="editor-label">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.ConfirmPassword)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.ConfirmPassword)
                @Html.ValidationMessageFor(m => m.ConfirmPassword)
            </div>

@LabelFor(m=>m.Password)
@Html.PasswordFor(m=>m.Password)
@Html.ValidationMessageFor(m=>m.Password)
@LabelFor(m=>m.ConfirmPassword)
@Html.PasswordFor(m=>m.ConfirmPassword)
@Html.ValidationMessageFor(m=>m.ConfirmPassword)
不起作用:

<div class="editor-label">
                @Html.LabelFor(m => m.RegisterModel.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.RegisterModel.Password)
                @Html.ValidationMessageFor(m => m.RegisterModel.Password)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.RegisterModel.ConfirmPassword)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.RegisterModel.ConfirmPassword)
                @Html.ValidationMessageFor(m => m.RegisterModel.ConfirmPassword)
            </div>

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

生成的HTML属性之一,即用于jQuery验证插件的
@HTML.PasswordFor(m=>m.RegisterModel.ConfirmPassword)
数据值equalto other=“*.Password”
不好。我曾经使用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版本存在一个错误,即嵌套属性由于未转义而找不到。此错误已在最新版本的Microsoft.jQuery.Unobtrusive.Validation软件包中修复,该软件包可使用NuGet获得

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

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

这意味着这个不引人注目的插件现在可以正确地处理带有嵌套属性的表单了

我知道jQuery的选择器在选择带有句点的元素时有问题,它们必须被转义,即
$('RegisterModel\.Password')很遗憾,我不知道如何使用验证库修复此问题。谢谢,这是问题的一部分。现在,用一个小的HOBJORY管理它。考虑把黑客作为一个答案来回答任何同一个问题的人。你使用什么版本的不显眼的验证工具插件?微软。jQuery。
escapeAttributeValue('this!thing') // this\!thing