ホーム > .NET, ASP.NET 備忘録 > ASP.NET MVC 2 で簡単データ検証

ASP.NET MVC 2 で簡単データ検証

EnableDynamicDataを利用してWebフォームでDataAnnotationを使ったデータ検証方法をまとめてきましたが、DataAnnotationはASP.NET MVC 2でも利用できます。
その動作を確認できるサンプルを作成してみました。

ただし、サンプルアプリケーション自体の作り方についてはこの記事では説明しません。
ウィザードが生成するスキャッフォールドの状態に最低限の手しか入れてないので、説明する内容もほとんどないですし。

リストページ

サンプルアプリケーションを起動すると上記のようなページが表示されます。
ここでEditリンクをクリックし、データを適当に修正して更新しようとすると、以下のようなエラーが表示されます。

エラー1

このサンプルではEntity Data Modelを利用しています。
そして、上記のエラーを表示させるためのDataAnnotationの設定は以下のプログラムで行っています。

——————————————————————————————————————-

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Objects;

/// <summary>
/// Summary description for Person
/// </summary>
namespace MvcApplication2.Models
{
    [MetadataType(typeof(MetaPerson))]
    [CustomValidation(typeof(MetaPerson), "CheckAge_Mail")]
    public partial class Person
    {
    }

    public class MetaPerson
    {
        [DisplayName("ユーザID")]
        public int id { get; set; }

        [Required(ErrorMessage = "名前は必須項目です")]
        [DisplayName("名前")]
        public string name { get; set; }

        [DisplayName("年齢")]
        [Required(ErrorMessage = "年齢は必須項目です")]
        [Range(0, 120, ErrorMessage = "年齢に誤りがあります")]
        public int age { get; set; }

        [DisplayName("メールアドレス")]
        [RegularExpression(@"\w+([-+.’]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "正しいメールアドレスを入力してください")]
        public string mail { get; set; }

        [DisplayName("備考")]
        [CustomValidation(typeof(MetaPerson), "CheckMinLength")]
        public string memo { get; set; }

        public static ValidationResult CheckMinLength(string memo, ValidationContext vCont)
        {
            if (memo == null || memo.Length < 5)
                return new ValidationResult("5文字以上入力入力してください");
            return ValidationResult.Success;
        }

        public static ValidationResult CheckAge_Mail(Person p)
        {
            if (p.age >= 20 && p.mail == null)
                return new ValidationResult("成人はメールアドレス必須です");
            return ValidationResult.Success;
        }
    }
}

——————————————————————————————————————-

ここで注目してほしいのはPersonクラスに対してCustomValidation属性を設定しているところです。
Personクラスが持つ複数のプロパティの状態をチェックしてエラーを表示することができます。
EnableDynamicDataを利用した場合は、クラスにCustomValidation属性を設定してもそこでのエラーをうまくひろって表示してくれませんでした。
そのため、イベントを登録してデータを保存する直前でValidationExceptionを返すといったプログラムを記述する必要がありました。
ASP.NET MVC 2では同じ内容をCustomValidation属性をクラスに付加することでこんなに簡単に実装できてしまいます。

このエラーは以下のように表示されます。

エラー2

このエラー表示のためにスキャッフォールドで作成されたViewに手を加える必要はありません。
デフォルトの状態でこういったModelレベルでのエラーの表示に対応しています。

ちなみにControllerのほうはちょっと手を加える必要があります。
スキャッフォールドで生成されるEditメソッドだとtry-catchでエラーを拾うようになっていますが、そこを以下のようにModelStateの状態を判断するようなプログラムに置き換えます。
メソッドの引数でModelを利用する点も注意が必要かな。

——————————————————————————————————————-

[HttpPost]
public ActionResult Edit(int id, Person editPerson)
{
    if(ModelState.IsValid)
    {
        pService.UpdatePerson(id, editPerson);
        return RedirectToAction("Index");
    }
    else
    {

        return View(editPerson);
    }
}

——————————————————————————————————————-

なお、このサンプルで利用しているCustomValidation属性ですが、これは.NET Framework 4で追加されたものです。
ASP.NET MVC 2は.NET Framework 3.5上でも動作しますし、その場合にDataAnnotationも使えるのですが、CustomValidation属性は使えませんので注意してください。

ASP.NET MVC 2のテンプレートで生成される認証用のModelではこのあたりを考慮しているのかValidationAttributeを拡張したクラスで独自の検証を行っています。
CustomValidation属性が使えない.NET Framework 3.5ではその方法がもっともシンプルだと思います。

カテゴリー:.NET, ASP.NET 備忘録
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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