検証のカスタマイズ
Dynamic Dataにおいて検証は第1回でも触れたように属性クラスを使用して実施します。本項は、多少複雑な検証を実施したい時に必要な属性クラスの活用並びにカスタマイズを紹介します。Dynamic Dataで利用できる属性一覧並びに基本的な使用方法については第1回を参照ください。
CustomValidation属性を使用した検証のカスタマイズ
CustomValidation属性は、通常の属性では検証できない複雑な検証を実施したい時に検証メソッドを作成し、それを属性として使用できる特殊な属性クラスです。記載例は次のようになります。
[CustomValidation(typeof(カスタム検証メソッドを持つクラス), "カスタム検証メソッド名")]
検証メソッドは下記のように記載します。ここは検証部分なので利用者が検証したい内容を自由に書けます。
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace CodeZine3_2
{
// モデルクラスに関連付けるメタデータクラスの指定
[MetadataType(typeof(MetaNorthWind))]
public partial class Employees
{
}
// FamilyAnnotationエンティティ型のプロパティを記載
public class MetaNorthWind
{
[DisplayName("敬称")]
[CustomValidation(typeof(MetaNorthWind), "CheckTitle")]
public String TitleOfCourtesy { get; set; }
// カスタム検証メソッド
public static ValidationResult CheckTitle(string TitleOfCourtesy, ValidationContext vCont)
{
if (TitleOfCourtesy == null || TitleOfCourtesy.Length > 10)
{
return new ValidationResult("10文字以内で入力してください。");
}
else if (TitleOfCourtesy == "ジニアス")
{
return new ValidationResult("ジニアスは使用できません。");
}
return ValidationResult.Success;
}
}
}
カスタム検証メソッドはstaticのメソッドで記載します。戻り値は検証結果を格納するため、ValidationResultオブジェクトとなります。パラメータはリクエスト時の検証したい値です。CheckTitleメソッドでは、TitleOfCourtesyプロパティの値を元に入力制限と、ジニアスという値が使用されているかどうかを検証しています。"ジニアス"という文字以外で10文字以内の値が格納された時に検証を通過します(図4~5)。


以上がCustomValidation属性を使用したカスタム検証メソッドの作成方法です。
恐らくこのカスタム属性を使えばDynamic Data内の検証のカスタマイズはほとんど網羅できるでしょう。凝ったカスタマイズもできる反面それを突き詰めすぎるとDynamic Dataのうま味である「お手軽に動的データアプリができる」という部分を損なう可能性があるので利用時の線引きはしっかりと行いましょう。
カスタムの検証属性の作成方法
CustomValidation属性を活用すれば大抵の検証は実装できます。しかし、さまざまな場所で同様の検証を行いたい場合は、カスタムの検証属性クラスを作成し一元化することが保守面などから見ても効果的です。DataAnnotationが提供する検証属性クラスはValidationAttributeクラスをベースとして作られています。このValidationAttributeクラスを継承し、必要な記載を追加することで、簡単にカスタム検証属性が作成できます。このカスタム検証属性の作成方法はMVC 2の検証記事にて記載しているのでそちらを参照ください。
なお、前述のとおり、様々な場所で同様の検証を行いたい時には効果的ですが、そうでない場合はCustomValidation属性を使用した検証を活用しましょう。
まとめ
今回はDynamic Dataを簡単にカスタマイズするために着手しやすいデータフィールドのカスタマイズと属性クラスの活用ならびにカスタマイズについてご紹介しました。見た目並びに動作部分と、検証の仕組みを知ることで工数を削減しつつ、より動的データアプリを作成しやすくなるので、Dynamic Dataを活用する際は本稿の内容をベースに幅を広げていただければと思います。次回はDynamic Dataの活用連載も最終回なので、フィルタリングのカスタマイズと、エンティティテンプレートの活用方法について紹介する予定です。お楽しみに。
