新たに追加された属性クラスについて
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から利用可能となった属性クラスについて紹介します。
なお、今回のサンプルプログラムはユーザー情報に関するモデルをコードファーストで作成しています。ざっくりとしていますが、今回利用しているコードファーストのクラスは以下のとおりです。コードファーストについてはこちらを参照ください。
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のとおりです。
属性の記述は以下のようになります。
[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のとおりです。
Remote属性の構文は以下のとおりです。
[Remote("メソッド名","コントローラー名")]
CustomValidationと異なる点はControllerクラス上にアクションメソッドを記載する点です。Controller上に記載することで、データベースの値との対比などを実現することもできます。例えば、ユーザー情報を登録する際に既にユーザーIDなどユニークであるべき情報の利用状況チェックなどが手軽にできます。属性の記述は以下のようになります。
[Remote("CheckLastName","UserInfo")]
public string LastName { get; set; }
今回は汎用的とは言えませんが、UserInfoControllerクラスにCheckLastNameメソッドを作成し、苗字が入力されている場合に既にその苗字が使用されているかどうかを判定しています。処理は以下のとおりです。
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つになるでしょう。
