ViewModel のフィールドに配置された属性に対して、MVC4 フィールドのクライアント側、javascript または jQuery 主導の検証を処理するための最良の方法を知りたいです。
まず、例を挙げてみましょう。アプリケーションの初回起動時に表示される管理者用のログイン作成画面 (サイト所有者に「初回ログインとして admin/admin を使用してください」とは言わないでください)。
ビューモデル:
public class AdministratorViewModel : AbstractViewModel
{
[Required]
[Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblUsername")]
public string Username { get; set; }
[Required]
[Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblEmailAddress")]
[EmailAddress]
public string EmailAddress { get; set; }
[Required]
[Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblPassword")]
[AdminPassword]
public string Password { get; set; }
[Required]
[Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblPasswordConfirm")]
[Compare("Password")]
public string PasswordConfirm { get; set; }
[Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblLastLogin")]
public DateTime? LastLogin { get; set; }
[Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblPasswordExpiry")]
public DateTime? PasswordExpiry { get; set; }
[Display(ResourceType = typeof(ManageAdminsViewModelResources), Name = "lblBlocked")]
public bool Blocked { get; set; }
}
部分的なビュー (最初の管理者を作成するときに必要なフィールドはわずかです)
@using (Html.BeginForm())
{
@Html.ValidationSummary(false)
@Html.AntiForgeryToken()
<fieldset>
<legend>@ManageAdminsViewResources.legendCreateAdmin</legend>
<div class="desktoptile">
@Html.LabelFor(m=>m.Username)
@Html.EditorFor(m => m.Username)
@Html.ValidationMessageFor(m => m.Username)
</div>
<div class="desktoptile">
@Html.LabelFor(m=>m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<div class="desktoptile">
@Html.LabelFor(m=>m.PasswordConfirm)
@Html.PasswordFor(m => m.PasswordConfirm)
@Html.ValidationMessageFor(m => m.PasswordConfirm)
</div>
<div class="desktoptile">
@Html.LabelFor(m=>m.EmailAddress)
@Html.EditorFor(m => m.EmailAddress)
@Html.ValidationMessageFor(m => m.EmailAddress)
</div>
<input type="submit" value="@ManageAdminsViewResources.btnCreate"/>
</fieldset>
}
コントローラ
[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateFirst(AdministratorViewModel viewModel)
{
if (!ModelState.IsValid) return View(viewModel);
[...................]
現在
無効な電子メール アドレスや空のパスワードなどをフォームに入力して [送信] をクリックすると、エラーが正しく通知されます。では、続けましょう
私が欲しいもの
私は Metro スタイルのデザインを行っているので、ユーザーがフォーカスを外すたびに、そのフィールドのテキスト ボックスの検証が発生するようにしたいと考えています。
ハードコーディングされた jQuery フラグメントを記述することは、最良の選択肢ではありません。現在学習しているMVC4に組み込まれている可能性がある、データ駆動型のアプローチが必要です。
したがって、標準属性とカスタム属性を持つ ViewModel が与えられた場合 (そのためには、少し Javascript が必要ですが、Org.Zighinetto.AdminPasswordAttribute
パスワードの複雑さをチェックすることを考えてください)、クライアントを指定せずに、最も目立たない方法でクライアント側の検証を強制するにはすべてのhtmlタグにサイドタグを付けて、最小限のコードを書いていますか?
ASP.NET MVC 4 の検証には、再表示しなければならない秘密がまだありますか?