属性による値検証
実はSilverlightにはこの例外を使った検証以外にいくつかの検証方法があるのですが、今回はおそらく今後主流になっていくであろうデータアノテーションを使った検証方法を紹介します。
データアノテーションを使った検証を利用する場合は、まずプロジェクトにSystem.ComponentModel.DataAnnotationsアセンブリの参照を加えます。検証に利用する属性の多くはこのDataAnnotations名前空間に含まれます。表1に代表的な検証に利用できる属性を示します。これらの検証はASP.NETの検証コントロールとほぼ同じ意味を持つため、ASP.NET開発者はなじみが深いと思います。
| データアノテーション名 | 概要 |
| RequiredAttribute | 値が空でないか検証します |
| RangeAttribute | 範囲内に値があるかを検証します |
| RegularExpressionAttribute | 正規表現を使って値がパターンに合致しているか検証します |
| StringLengthAttribute | 文字列の長さを検証します |
| CustomValidationAttribute | カスタムコードを利用して値を検証します |
データアノテーションを利用して書き換えたバージョンをリスト9に示します。
/// <summary>
/// 氏名
/// </summary>
/// <remarks>
/// 氏名は必ず入力され、40文字以内であること。
/// </remarks>
[Display(Name = "氏名", Description = "40文字以内で入力してください。")]
[Required(ErrorMessage = "氏名は必須入力です。")]
[StringLength(40, ErrorMessage = "氏名は40文字以内で入力してください。")]
public string UserName
{
get { return _userName; }
set
{
Validator.ValidateProperty(value,
new ValidationContext(this, null, null) { MemberName = "UserName"});
_userName = value;
OnPropertyChanged("UserName");
}
}
private string _age;
/// <summary>
/// 年齢
/// </summary>
/// <remarks>
/// 年齢は必ず入力され、20以上の整数であること。
/// </remarks>
[Display(Name = "年齢", Description = "20歳以上150歳以内で入力してください。")]
[Required(ErrorMessage = "年齢は必須入力です。")]
[Range(typeof(int), "20", "150", ErrorMessage = "年齢は20歳以上を入力してください。")]
public string Age
{
get { return _age; }
set
{
Validator.ValidateProperty(value,
new ValidationContext(this, null, null) { MemberName = "Age"});
_age = value;
OnPropertyChanged("Age");
}
}
検証の属性の指定自体は特に問題なく理解できると思います。ここでは各Setterの中で行っているこの部分について少し解説しておきます。
Validator.ValidateProperty(value,
new ValidationContext(this, null, null) { MemberName = "Age"});
書き方は変わりましたが基本的にやっていることは、例外のコードとほぼ同じです。ValidatePropertyメソッドは第1引数に渡された値が、ValidationContextに指定されたプロパティに指定された検証属性にマッチしているかを検証し、不正なデータである場合はValidationExceptionの例外を投げているだけです。
ValidationContextでは第1引数に検証対象のインスタンスを渡します。第2、第3引数はカスタム認証を利用する場合の認証サービスの取得とパラメータの受け渡しに利用します。
また、検証対象がページのどの値かを指定するためにValidationContextのMemberNameプロパティに取得元のコントロール名を指定します。
まとめ
今回はSilverlight 3で強力になったXAMLのスタイルと、業務アプリケーションの開発に欠かせない値の検証部分を中心に解説を行いました。両方ともそれほど派手な機能ではありませんが、便利な機能ではないでしょうか。Silverlight 4もリリースされましたが、Silverlight 3の連載は次回で最終回になります。最後までよろしくお付き合いください。
