Modelに[DataType(DataType.Password)]を適用すると、@Html.EditorForModel()を使用する際にパスワード入力フィールドが自動生成されます。他のDataTypeも同様の仕組みで動作します。
クライアント側での検証メッセージ表示を有効にするには、以下のスクリプトを参照する必要があります:
- "~/Scripts/jquery.unobtrusive*"
- "~/Scripts/jquery.validate*"(*は接頭語以降のすべてのファイルを指す)
- 必須項目の検証:[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)
{
// 検証成功時の処理
}
- 文字列長さの制限:[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のコードは上記と同様です。
- 正規表現による検証:[RegularExpression]
例:6〜12文字の英数字のみ許容
[Required]
[RegularExpression(@"^[a-zA-Z0-9]{6,12}$", ErrorMessage = "{0}は不正な形式です")]
[Display(Name = "ユーザー名")]
public string UserName { get; set; }
- 値の範囲指定:[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 = "利用規約に同意してください")]
- 二回のパスワード入力の一致確認:[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; }
- サーバー側での非同期検証:[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);
}
- 自作検証属性の作成: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; }