0

在我看来,如果我使用一个只有标量的模型,基本属性即 [RegisterModel] 一切正常。但是,如果我使用其中一个或多个属性设置为另一种 .net 复杂类型的视图模型类型,例如 [RegisterModelAndLogOnModel],则生成的 HTML 无法与 jQuery 验证插件一起正常工作。使用 jQuery 1.7.2 它总是告诉我确认密码与密码不匹配,在 jQuery 1.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>

不工作:

<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>
4

2 回答 2

0

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

于 2012-10-24T12:11:46.157 回答
0

正如@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

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

于 2012-10-31T10:59:35.250 回答