以下に示すように、電子メール アドレス プロパティと電子メール アドレスの確認プロパティを持つビュー モデルがあります。
public class UserNewModel
{
[Required]
[StringLength(100)]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email Address")]
public string EmailAddress { get; set; }
[Required]
[StringLength(100)]
[DataType(DataType.EmailAddress)]
[Display(Name = "Confirm Email Address")]
[Compare("EmailAddress", ErrorMessage = "The email address and confirmation email address do not match.")]
public string ConfirmEmailAddress { get; set; }
}
このモデルに強く型付けされた、対応する EditorTemplate があります。
@model SponsorworksSaaS.UI.Models.UserNewModel
<div class="editor-label">
@Html.LabelFor(m => m.EmailAddress)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.EmailAddress)
@Html.ValidationMessageFor(m => m.EmailAddress)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.ConfirmEmailAddress)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.ConfirmEmailAddress)
@Html.ValidationMessageFor(m => m.ConfirmEmailAddress)
</div>
私の UserNewModel は、次のような他のモデルに含まれています。
public class CompanyDetailsModel
{
....
/// <summary>
/// Used to capture the initial user account details when creating a new company
/// </summary>
[Display(Name = "Initial User Account")]
public UserNewModel NewCompanyUser { get; set; }
}
この親モデルに関連付けられた対応する厳密に型指定されたビューは、 @Html.EditorFor を使用してエディター テンプレートを表示します。
@model SponsorworksSaaS.UI.Models.CompanyDetailsModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true, "Company change was unsuccessful. Please correct the errors and try again.")
<div>
<fieldset>
<legend>Company Information</legend>
<div>
@Html.EditorFor(m => m.NewCompanyUser)
</div>
<p>
<input type="submit" name="btnSubmit" value="Save Company" />
</p>
</fieldset>
</div>
}
クライアント側での比較検証は、電子メール アドレスに対して常に失敗します。電子メール アドレスの比較テキスト ボックスに同じ文字列を入力すると、フォーカスを離すと常に比較検証エラー メッセージが表示されます。クライアント側で比較検証が失敗した場合でも、フォームを送信すると、ModelState.IsValid は true ですが、サーバー側で比較検証が行われているかどうかはわかりません。
生成されたビュー ソースを以下に示します。
<div class="editor-label">
<label for="NewCompanyUser_EmailAddress">Email Address</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-length="The field Email Address must be a string with a maximum length of 100." data-val-length-max="100" data-val-required="The Email Address field is required." id="NewCompanyUser_EmailAddress" name="NewCompanyUser.EmailAddress" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="NewCompanyUser.EmailAddress" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="NewCompanyUser_ConfirmEmailAddress">Confirm Email Address</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-equalto="The email address and confirmation email address do not match." data-val-equalto-other="*.EmailAddress" data-val-length="The field Confirm Email Address must be a string with a maximum length of 100." data-val-length-max="100" data-val-required="The Confirm Email Address field is required." id="NewCompanyUser_ConfirmEmailAddress" name="NewCompanyUser.ConfirmEmailAddress" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="NewCompanyUser.ConfirmEmailAddress" data-valmsg-replace="true"></span>
</div>
ここの他の投稿で提案されているように、jquery.validate.unobtrusive.js ファイルに一重引用符を追加しようとしましたが、これで問題は解決しませんでした。
element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];
に変更:
element = $(options.form).find(":input[name='" + fullOtherName + "']")[0];
min と full の両方の js ファイルを使用してみましたが、問題は同じままです。実際、ready 関数に jquery を追加すると、次のようになります。
$(function () {
var e1 = $('form').find(":input[name=*.EmailAddress]");
var e2 = $('form').find(":input[name='*.EmailAddress']");
alert(e1);
alert(e1[0]);
alert(e2);
alert(e2[0]);
});
alert(e2[0]) は undefined を返しますが、alert(e1[0]) は予想されるテキスト ボックス要素を返します。