Validation(サーバーサイド・クライアントサイド)
MVC 1時代の検証は、サーバに一度問い合わせる必要があり、お世辞にも優れているとは言いづらい機能でした。以前の連載では、外部ツールxValを使用することでMVC 1における検証を強化していました。
MVC 2時代の基本的な入力検証はDataAnnotationの設定により、サーバーサイドとクライアントサイド、それぞれ実施できるようになりました(図1)。
xValは、MVC 1時代において効果的な検証を実現できましたが、細かな検証ルールの作成が必要でした。MVC 2が標準でサポートするサーバ/クライアントサイドの検証は、より簡易で強力です。DataAnnotationで検証規約を定め、サーバーサイドにリクエスト時、また、クライアントサイドではスクリプトを使用して実行時に検証を実施できます。強力になった検証をフル活用しましょう。
DataAnnotationの理解
MVC 2の検証を知るためには、DataAnnotationの理解が必要です。ASP.NET MVCと周辺技術の活用テクニックでも触れましたが、今一度、DataAnnotationについて解説します。
DataAnnotationの理解
System.ComponentModel.DataAnnotations名前空間はASP.NET Dynamic DataでDynamic Dataコントロールの検証を行うために利用された名前空間です。これまで検証ロジックは、コードベースでnullチェックや入力数を確認していましたが、DataAnnotationを利用すると属性宣言だけで、入力検証を簡単に設定できます。
// 必須入力チェック [Required(ErrorMessage="必須入力項目です")] // 文字数チェック [StringLength(6, ErrorMessage="メンバIDは6文字以内で入力してください")]
.NET 3.5ベースでは、Dynamic Dataで主に利用されていましたが、ASP.NET MVCでも応用できます。なお、このDataAnnotationは、WPF4.0や、Silverlightでも利用できます。これからの検証のスタンダードになり得る可能性が非常に高い、注目の名前空間です。
以下に、利用可能な検証属性を紹介します。
属性クラス | 概要 |
CustomValidationAttribute | .NET 4から提供されている属性で、カスタムメソッドを指定 |
DataTypeAttribute | プロパティにメールアドレスや電話番号など、追加の型を指定 |
RangeAttribute | 値の数値範囲を指定 |
RegularExpressionAttribute | 正規表現を指定 |
RequiredAttribute | 必須項目を指定 |
StringLengthAttribute | 最大文字長を指定 |
それでは以上を踏まえて、次ページから実際の検証手順を解説します。
ASP.NET MVC 2におけるValidation
MVC 2における検証は以下の流れで設定します(図2)。
- モデルの作成
- DataAnnotationの宣言
- サーバ/クライアントサイドの検証機能の有効化
モデルの作成
今回はEntity Data Model(以下、EDM)をモデルとして使用します。EDMの作成手順は次のとおりです。
- Pubsデータベースをプロジェクトに追加
- ソリューション エクスプローラを展開し、Modelsフォルダ上で[追加]-[新しい項目]を選択
- 選択後[新しい項目の追加]ダイアログが表示されるので[データ]テンプレートから「ADO.NET Entity Data Model」を選択し、名前を「Pubs.edmx」と設定後[追加]ボタンをクリック
- Entity Data Modelウィザードが起動する。「モデルに含めるコンテンツ」では、[データベースから生成]を選択して[次へ]ボタンをクリック。
- 「データ接続の選択」では、Pubsデータベースの接続設定を行い[次へ]ボタンをクリック
- 「データベース・オブジェクトの選択」では、[テーブル]-[publishers]にチェックし(publishersテーブル選択)、[完了]ボタンをクリック。
以上で、EDMが生成されます。ViewやController側で、Modelを利用する際にModelを参照するために、EDM生成後は必ずプロジェクトのビルドを行ってください。Modelの準備は以上です。
DataAnnotationの宣言
続いて作成したEDMに対してDataAnnotationの宣言を実施します。DataAnnotationの宣言のポイントは以下の2つです。
- EDMで生成されたエンティティ型のpartialクラスに対して、新たなpartialクラスファイルを作成しメタデータの属性を指定してEDMへの検証属性をリンク
- リンクさせたエンティティ型へ検証属性を指定
それでは、実際に属性を指定します。手順は次のとおりです。
- Modelsフォルダ上で[追加]-[クラス]を選択
- 選択後、テンプレートとして「クラス」を選択した状態で[新しい項目の追加]ダイアログが表示されるので、名前を「publishers_validation.cs」と設定後[追加]ボタンをクリック
- 生成されたクラスにPartialクラスと、メタデータの指定、DataAnnotationの属性指定を実施
記載は次のとおりです。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace CodeZineMVC2.Models { // モデルクラスに関連付けるメタデータクラスの指定 [MetadataType(typeof(publishers_validation))] public partial class publishers { } // publishersエンティティ型のプロパティを記載 public class publishers_validation { // 必須入力チェック [Required(ErrorMessage = "必須項目です")] // 表示名指定 [DisplayName("ID(Pub_ID)")] // 値の範囲チェック [Range(0,10000, ErrorMessage = "0から10000の間の数字を入力してください。")] public string pub_id { get; set; } [DisplayName("出版社(Pub_Name)")] [Required(ErrorMessage = "出版社名を入力してください。")] public string pub_name { get; set; } [DisplayName("市町村(City)")] public string city { get; set; } [DisplayName("都道府県(State)")] // 文字数チェック [StringLength(2,ErrorMessage="2文字で入力してください。")] public string state { get; set; } [DisplayName("国")] public string country { get; set; } } }
MetadataType属性は、データモデルクラスに関連付けるメタデータクラスを指定します。今回は、publishers_validationクラスを指定しました。publishers_validationクラスでは、publishersエンティティ型が持つプロパティを記載します。この時、EDM側で実際にどの型が指定されているのか確認して記載します(今回のサンプルは偶然すべてがstring型でした)。
DisplayName属性は、モデルを型付けしたラベルに表示する文字列を指定します。それ以外に使用する主な属性は前述した「利用可能な検証属性」を参考ください。
プロパティに応じて必要な属性を指定します。
DataAnnotationの指定もできました。続いて、サーバ/クライアントサイドの検証機能の有効化を実施します。まずはサーバーサイドからです。