locked
DataAnnotationsでの入力検証属性の再利用について RRS feed

  • 質問

  • こんにちは。

    以下のようなクラスを作成し、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