CodeZine(コードジン)

特集ページ一覧

ASP.NET MVC 3における検証まわりの改善点

ASP.NET MVC3入門(3)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2011/10/03 14:00
目次

新たに追加された属性クラスについて

 MVC 2は.NET 4と同時にリリースされたので、.NET 4に搭載されているDataAnnotation名前空間に新たな属性が追加されました。CustomValidationAttributeクラスがそれに当たります。MVC 3でも新たに属性クラスが追加されていますが、これはDataAnnotation名前空間ではなく、MVC 3のコアライブラリであるSystem.Web.MVC名前空間に追加されています。では、ここでMVC 3に標準で利用できる属性クラスを列挙してみます。

主な属性クラス
属性クラス 概要 利用できるMVCのバージョン
CustomValidationAttribute .NET 4から提供されている属性で、カスタムメソッドを指定 2
CompareAttribute 指定された属性と、値が同一かチェックするために該当のプロパティを指定 3
DataTypeAttribute プロパティにメールアドレスや電話番号など、追加の型を指定 2
RemoteAttribute jQueryにからActionに検証をリクエストする属性。ActionメソッドとControllerを指定 3
RangeAttribute 値の数値範囲を指定 2
ReadOnlyAttribute 読み取り専用かどうかを指定 3
RegularExpressionAttribute 正規表現を指定 2
RequiredAttribute 必須項目かどうかを指定 2
StringLengthAttribute 最大文字長を指定 2

 基本的な属性クラスの利用法についてはASP.NET MVC 2による検証機能を参照ください。今回はMVC 3から利用可能となった属性クラスについて紹介します。

 なお、今回のサンプルプログラムはユーザー情報に関するモデルをコードファーストで作成しています。ざっくりとしていますが、今回利用しているコードファーストのクラスは以下のとおりです。コードファーストについてはこちらを参照ください。

属性記載前のコードファーストクラス(User.cs)
using System;

namespace MVC3DataAnnotationsSample.Models
{
    public class User
    {
        public int Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
        public string ComfirmEmail { get; set; }
        public bool CheckPartner { get; set; }
        public string PartnerName { get; set; }
        public string Remarks { get; set; }
    }
}

CompareAttributeクラス

 MVC 2まではプロパティ値の比較が実施できませんでした。MVC 3からはCompareAttributeクラスが提供されているので、属性によるプロパティ値の比較が実現できるようになりました。実行結果は図1のとおりです。

図1 Compare属性指定箇所の実行結果
図1 Compare属性指定箇所の実行結果

 属性の記述は以下のようになります。

Compare属性の指定(User.cs)
[Required]
public string Email { get; set; }

[Compare("Email", ErrorMessage = "入力されたEmailと異なります。")]
public string ComfirmEmail { get; set; }

 Compare属性では第一パラメータに比較したいプロパティをString型で記述します。第二パラメータで、比較結果が同一でない場合のエラーメッセージなどを入力します。

 実際の活用例としては主にユーザー情報入力ページでの活用が考えられます。例えばEmailアドレスやパスワード入力時における確認用のEmailアドレス、パスワード入力検証に活用することが多いでしょう。

RemoteAttributeクラス

 MVC 2まではクライアントサイドから気軽にサーバー側のデータを利用した検証は実現できませんでした。MVC 3では、RemoteAttributeクラスを使用することで、jQueryによるサーバーサイドに処理を記述した検証を実現できます。実行結果は図2のとおりです。

図2 Remote属性の検証例
図2 Remote属性の検証例

 Remote属性の構文は以下のとおりです。

Remote属性の構文例
[Remote("メソッド名","コントローラー名")]

 CustomValidationと異なる点はControllerクラス上にアクションメソッドを記載する点です。Controller上に記載することで、データベースの値との対比などを実現することもできます。例えば、ユーザー情報を登録する際に既にユーザーIDなどユニークであるべき情報の利用状況チェックなどが手軽にできます。属性の記述は以下のようになります。

Remote属性の指定(User.cs)
[Remote("CheckLastName","UserInfo")]
public string LastName { get; set; }

 今回は汎用的とは言えませんが、UserInfoControllerクラスにCheckLastNameメソッドを作成し、苗字が入力されている場合に既にその苗字が使用されているかどうかを判定しています。処理は以下のとおりです。

CheckLastNameメソッドの記載例(UserInfoController.cs)
public JsonResult CheckLastName(string LastName) 
{
    // LastNameを既に使用していないか判定
    var user = db.Users.FirstOrDefault(d => d.LastName == LastName);
    if (user != null)
    {
        // エラーメッセージを返す
        return Json(String.Format("すでに{0}は使用されています", LastName), JsonRequestBehavior.AllowGet);
    }
    else
    {
        // 検証成功を返す
        return Json(true, JsonRequestBehavior.AllowGet);
    }
}

 戻り値はJSON形式でやり取りするためにJsonメソッド(JsonResultオブジェクト)を使用しています。パラメータはモデルクラスのプロパティ名と同一に指定することで、値の受け渡しを実現します。

 内部の処理は苗字の使用状況を判定し、Jsonメソッドの第一パラメータに検証結果を、第二パラメータにクライアントサイドからのGetリクエストに対応するかどうかをJsonRequestBehavior列挙体で指定します。

 実行結果は図2のようになります。

 以上がRemote属性を使用し検証メソッドの作成方法です。二点注意があります。

  • Remote属性はJavaScriptが動作する環境であることが前提の属性クラスです。そのため、JavaScriptを無効にしている環境の場合動作しない点には注意が必要です。
  • ユーザーIDの重複検証などに使用することができますが、属性指定するためCreate操作時はもちろんEdit操作時でもRemote検証は有効化されます。DisplayForヘルパーメソッドなどを使い、Edit操作時には表示のみにするなどの対応が必要となります。

 新しく追加された属性クラスの中で使う可能性が高いのは上記2つになるでしょう。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:ASP.NET MVC3入門

著者プロフィール

  • WINGSプロジェクト ナオキ(ナオキ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5