トップ回答者
DataAnnotationsでの入力検証属性の再利用について

質問
-
こんにちは。
以下のようなクラスを作成し、BindingとSystem.ComponentModel.DataAnnotationsの検証属性を使用した入力検証を行っています。
public class Hoge1 : INotifyPropertyChanged { private string _TelNo = null; [Display(Name = "電話番号", Description = "13文字以内で入力")] [StringLength(13, ErrorMessage = "{1}文字以内で入力してください")] public string TelNo { get { return _TelNo; } set { if (_TelNo == value) return; var ctx = new ValidationContext(this, null, null); ctx.MemberName = "TelNo"; Validator.ValidateProperty(value, ctx); _TelNo = value; OnPropertyChanged("TelNo"); } } }
このようにプロパティ「電話番号」を持つクラスが複数存在する場合、
そのクラスごとの「電話番号」に入力検証属性を与えてやる必要があると思います。そこで質問なのですが、入力検証属性の定義を再利用する方法はないものでしょうか?
できれば、プロパティに与える入力検証属性を一元管理したいです。
再利用じゃなくても、入力検証属性を一元管理できる方法であればなんでもOKです。
何かよい方法があるのでしょうか?2010年6月2日 1:35
回答
-
>入力検証属性の定義を再利用する方法はないものでしょうか?
T4 (Text Template Transformation Toolkit)でテンプレートを作ることで可能になります。
http://msdn.microsoft.com/ja-jp/ff395920.aspx
手前味噌ですが、わんくま同盟 東京勉強会 #48 で ASP.NET MVCやSilverlight RIA サービス、 MVVMパターンを簡単に作成する方法をT4で構築 しますので関東の方でしたら直接いらっしゃるかUSTでご覧になったらいかがでしょうか?
http://www.wankuma.com/seminar/20100605tokyo48/Default.aspx
えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12- 回答としてマーク sennheiser 2010年6月3日 10:44
2010年6月3日 6:25
すべての返信
-
>入力検証属性の定義を再利用する方法はないものでしょうか?
T4 (Text Template Transformation Toolkit)でテンプレートを作ることで可能になります。
http://msdn.microsoft.com/ja-jp/ff395920.aspx
手前味噌ですが、わんくま同盟 東京勉強会 #48 で ASP.NET MVCやSilverlight RIA サービス、 MVVMパターンを簡単に作成する方法をT4で構築 しますので関東の方でしたら直接いらっしゃるかUSTでご覧になったらいかがでしょうか?
http://www.wankuma.com/seminar/20100605tokyo48/Default.aspx
えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12- 回答としてマーク sennheiser 2010年6月3日 10:44
2010年6月3日 6:25 -
えムナウ様
ご回答ありがとうございました!
とりあえず、T4を使用して、以下のようにプロパティごとにttファイルを作成して対応しました。
<#@ output extension=".txt" #> [Display(Name = "電話番号", Description = "13文字以内で入力")] [StringLength(13, ErrorMessage = "{1}文字以内で入力してください")] public string TelNo { get { return _TelNo; } set { if (_TelNo == value) return; var ctx = new ValidationContext(this, null, null); ctx.MemberName = "TelNo"; Validator.ValidateProperty(value, ctx); _TelNo = value; OnPropertyChanged("TelNo"); } } private string _TelNo = null;
で、定義したいクラスの方で以下の様にしてみました。
public class Hoge1 : INotifyPropertyChanged { <#@ include file="../tt/Work.txt" #> <#@ include file="../tt/Age.txt" #> <#@ include file="../tt/KanjiName.txt" #> <#@ include file="../tt/Address.txt" #> <#@ include file="../tt/TelNo.txt" #> public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string name) { var h = PropertyChanged; if (h != null) { h(this, new PropertyChangedEventArgs(name)); } } }
大変勉強になりました。T4とても便利ですね!いろいろ使い道がありそうです。
>わんくま同盟 東京勉強会 #48 …地方なので、USTで勉強させていただきます。
本当にありがとうございました。
2010年6月3日 11:07