MVCモデルデータ検証の実装方法

Modelに[DataType(DataType.Password)]を適用すると、@Html.EditorForModel()を使用する際にパスワード入力フィールドが自動生成されます。他のDataTypeも同様の仕組みで動作します。

クライアント側での検証メッセージ表示を有効にするには、以下のスクリプトを参照する必要があります:

  • "~/Scripts/jquery.unobtrusive*"
  • "~/Scripts/jquery.validate*"(*は接頭語以降のすべてのファイルを指す)
  1. 必須項目の検証:[Required]
[Required]
[Display(Name = "ユーザー名")]
public string UserName { get; set; }

View側のコード:

@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)

Controllerでは、検証を通ったかどうかを確認する必要があります:

if (ModelState.IsValid)
{
    // 検証成功時の処理
}
  1. 文字列長さの制限:[StringLength]

6文字以内:

[StringLength(6)]

6〜12文字:

[StringLength(12, MinimumLength = 6)]

Modelの定義:

[Required]
[StringLength(12, MinimumLength = 6)]
[Display(Name = "ユーザー名")]
public string UserName { get; set; }

ViewとControllerのコードは上記と同様です。

  1. 正規表現による検証:[RegularExpression]

例:6〜12文字の英数字のみ許容

[Required]
[RegularExpression(@"^[a-zA-Z0-9]{6,12}$", ErrorMessage = "{0}は不正な形式です")]
[Display(Name = "ユーザー名")]
public string UserName { get; set; }
  1. 値の範囲指定:[Range]

整数値の範囲(1〜100):

[Required]
[Range(1, 100)]
public int MyRange { get; set; }

日付範囲指定:

[Range(typeof(DateTime), "1/1/1900", "1/1/2200", ErrorMessage = "期間が無効です")]

論理値の必須チェック:

[Range(typeof(bool), "true", "true", ErrorMessage = "利用規約に同意してください")]
  1. 二回のパスワード入力の一致確認:[Compare]
[Required]
[DataType(DataType.Password)]
[StringLength(30, MinimumLength = 16, ErrorMessage = "パスワードは16〜30文字で入力してください")]
public string Password { get; set; }

[Required]
[DataType(DataType.Password)]
[Compare("Password", ErrorMessage = "パスワードが一致しません")]
public string ConfirmPassword { get; set; }
  1. サーバー側での非同期検証:[Remote]

例:データベースに既存のユーザー名があるか確認

[Required]
[RegularExpression(@"^[a-zA-Z0-9]{6,12}$")]
[Display(Name = "ユーザー名")]
[Remote("CheckUserName", "Account", ErrorMessage = "このユーザー名は使用されています")]
public string UserName { get; set; }

AccountController内でのアクションメソッド:

public JsonResult CheckUserName(string UserName)
{
    bool exists = !Database.UserExists(UserName); // ユーザー名が存在しない場合にtrueを返す
    return Json(exists, JsonRequestBehavior.AllowGet);
}
  1. 自作検証属性の作成:ValidationAttributeを継承

カスタム属性の定義(例:最大長制限):

using System.ComponentModel.DataAnnotations;

namespace MvcApplication1
{
    public class MaxLengthAttribute : ValidationAttribute
    {
        private readonly int maxLength;

        public MaxLengthAttribute(int length)
        {
            maxLength = length;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value == null || string.IsNullOrEmpty(value.ToString()))
                return ValidationResult.Success;

            if (value.ToString().Length > maxLength)
            {
                return new ValidationResult(
                    $"{validationContext.DisplayName}は{maxLength}文字以内にしてください");
            }

            return ValidationResult.Success;
        }
    }
}

Modelでの使用例:

[Required]
[MaxLength(12)]
public string UserName { get; set; }

タグ: ASP.NET MVC Data Annotations ValidationAttribute RegularExpression Remote Validation

10月16日 10:25 投稿