ホーム > ASP.NET MVC 3, mvcConf @:Japan > mvcConf @:Japan ふりかえり 4: バリデーション(入力値チェック)

mvcConf @:Japan ふりかえり 4: バリデーション(入力値チェック)

スライド14

ASP.NET MVCでは入力値のチェックに属性の設定によるバリデーションが利用できます。

Modelとして作成したクラスのプロパティに属性を設定するだけで以下のようなエラーチェックが可能です。

image_thumb9

ここではNameプロパティに

[Required(ErrorMessage="名前は必須入力です")]

Mailプロパティに

[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "メールが正しくありません")]

という属性を設定しています。

スキャッフォールディングで作成したビューでは、標準で上記の属性によるバリデーションがJQuery.Validateが利用され、クライアント側でチェックが行われるようになっています。
ビュー内に以下の記述がありますが、この記述をはずすとクライアント側でのチェックが行われなくなり、一度サーバーにリクエストをなげて、そこでエラーチェックが行われるようになります。

—————————————————————————————————–

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

—————————————————————————————————–

属性によるバリデーションは基本的に1つの項目(プロパティ)に対してチェックを行うものです。
複数の項目の値によってチェックを行いたい、という場合には属性ではチェックできません。

複数の項目間の値チェックを行うためにModelクラスに IValidatableObject を実装する、という方法が使えます。
Memberクラスを次のように修正します。

—————————————————————————————————–

public class Member : IValidatableObject
{
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "メールが正しくありません")]
    public string Mail { get; set; }
    public int CategoryID { get; set; }
    public DateTime? BirthDay { get; set; }
    public int? Age
    {
        get
        {
            int? age = null;
            if (BirthDay != null)
            {
                age = DateTime.Now.Year – BirthDay.Value.Year;
                if (DateTime.Now < BirthDay.Value.AddDays(-1).AddYears(age.Value)) age -= 1;
            }
            return age;
        }
    }

    public virtual Category Category { get; set; }

   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Age >= 20 && Mail == null)
            yield return new ValidationResult("20歳以上メールアドレス必須");
    }
}

—————————————————————————————————–

IValidatableObjectをMemberクラスの基底クラスとして設定し、Validateメソッドを実装しています。
Validateメソッド内ではエラーチェックを行い、エラーがある場合にyieldでValidationResultを返しています。
これにより、年齢が20歳以上になる場合にMailプロパティに値が入力されていないと、以下のようにエラーが表示されます。

image

バリデーションの実装方法にはほかにもいくつかの方法があります。
たとえばコントロール内でModelStateクラスにたいしてAddModelErrorメソッドを利用して直接エラー状態を設定する、といったことも可能です。

バリデーションの使い分けに関しては適材適所という考え方もありますが、むしろシステム全体として利用方針を決めておくべきでしょう。
バリデーションだけでなく、ASP.NET MVCは自由度が高いために同じことを実現するのに複数の実装方法が選択できる、ということが多いです。
このような場合、システムとしての実装方法の利用方針をあらかじめ決定しておくことで、統一感がありメンテナンスのしやすいシステムが構築できると思います。

カテゴリー:ASP.NET MVC 3, mvcConf @:Japan
  1. まだコメントはありません。
  1. 2011年6月22日 5:47 PM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。