0

私の見解では、スカラー、基本プロパティ、つまり [RegisterModel] だけを持つモデルを使用すると、すべて正常に動作します。しかし、1 つ以上のプロパティが別の .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

@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 に答える
0

生成された HTML 属性の 1 つ、つまりdata-val-equalto-other="*.Password"jQuery 検証プラグインで使用するためのものは適切で@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 に答える