2011-11-13 19 views
1

私たちは、私は一般的なプロパティにStingLengthValidator using VABを配置すること、およびエラーになっジェネリックプロパティ検証一般的なプロパティ検証アプリケーションブロック

public class BE 
    { 
     private List<Admin_Fee> _Admin_Fee = new List<Admin_Fee>(); 
     [StringLengthValidator(3, 
     MessageTemplate = "Fund City Can't be more than 3 Chars")] 
     public MyProperty<string> FUND_CITY { get; set; } 

     public MyProperty<int> SomeOtherProperty { get; set; } 

     public List<MyPropertyBase> MyDataPoints { get; set; } 

    } 

を持っている:

値がタイプ

期待されていませんが

誰かが助けてくれますか?

答えて

0

あなたがエラーを取得している理由はかなり単純です:あなたは、 StringLengthValidatorを文字列ではない型(実際はMyProperty<string>)に対して使用しようとしています。

質問はプロパティを検証するために何をするのですか?バリデーション・アプリケーション・ブロックの設計では、デザインが実際にはうまく適合しないため、扱いにくいです。

は通常、あなただけのMyPropertyクラスを検証するためにObjectValidatorを適用するだろうが、それはあなたが本当に適用することはできませんので、異なるルールでそれぞれ様々な値を保持するためにMyPropertyを使用することを目指すように見えるので、それは本当にこの場合には収まりませんバリデータの属性はMyPropertyです。

私はあなたがカスタムバリデーターで何を望むかを達成できると思います。私はあなたのカスタムバリデータの中に既存のバリデータをラップすることができると思っています。

ここで私はMyPropertyのようなものに見えると仮定しています:そして、あなたはカスタム検証MyPropertyValidatorを作成することができます

public class MyProperty<T> 
{ 
    public T Value { get; set; } 
} 

を:

public class MyPropertyValidatorAttribute : ValidatorAttribute 
{ 
    Microsoft.Practices.EnterpriseLibrary.Validation.Validator validator; 

    public MyPropertyValidatorAttribute(Type validator, params object[] validatorArgs) 
    { 
     this.validator = Activator.CreateInstance(validator, validatorArgs) 
      as Microsoft.Practices.EnterpriseLibrary.Validation.Validator;  
    } 

    protected override Microsoft.Practices.EnterpriseLibrary.Validation.Validator DoCreateValidator(Type targetType) 
    { 
     return new MyPropertyValidator(validator); 
    } 
} 

public class MyPropertyValidator : Microsoft.Practices.EnterpriseLibrary.Validation.Validator 
{ 
    Microsoft.Practices.EnterpriseLibrary.Validation.Validator validator; 

    public MyPropertyValidator(Microsoft.Practices.EnterpriseLibrary.Validation.Validator validator) 
     : this(validator.MessageTemplate, validator.Tag) 
    { 
     this.validator = validator; 
    } 

    public MyPropertyValidator(string message, string tag) : base(message, tag) 
    { 
    } 

    protected override string DefaultMessageTemplate 
    { 
     get { return ""; } 
    } 

    public override void DoValidate(object objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
    { 
     var val = objectToValidate; 

     Type t = objectToValidate.GetType(); 
     var propInfo = t.GetProperty("Value"); 

     if (propInfo != null) 
     { 
      val = propInfo.GetValue(objectToValidate, null); 
     } 

     validator.DoValidate(val, currentTarget, key, validationResults); 
    } 
} 

次にあなたがそうのようなあなたのクラスに注釈を付けることができます:

public class BE 
{ 
    [MyPropertyValidator( 
     typeof(StringLengthValidator), 
     0, RangeBoundaryType.Ignore, 
     3, RangeBoundaryType.Inclusive, 
     "Fund City Can't be more than 3 Chars", 
     false)] 
    public MyProperty<string> FUND_CITY { get; set; } 

    [MyPropertyValidator(
     typeof(RangeValidator), 
     0, RangeBoundaryType.Inclusive, 
     10, RangeBoundaryType.Inclusive, 
     "Must be between 0 and 10", 
     false)] 
     public MyProperty<int> SomeOtherProperty { get; set; } 
} 

私は広範囲にテストしていませんが、うまくいくようです。それにはいくつかの欠点があります:

  • これは柔軟性がありません。たとえば、コンポジットバリデータやその他のより複雑なシナリオをサポートしていません。おそらくすべてのケースを実装することができますが、それは乱雑になるでしょう。
  • 私の実装では、リフレクションを使用していますが、回避する方がよいでしょう。
  • 値型の潜在的なボクシング
+0

ありがとうございます。このコードを実装すると、エラー "メソッド 'Level2.MyProperty'1 [System.String、mscorlib、バージョン= 4.0.0.0、カルチャ=ニュートラル、PublicKeyToken = b77a5c561934e089]を取得しています。メソッドの中で:public override void DoValidate –

+0

@ H.N.Mishra:あなたが 'MyProperty'クラスを投稿しなかったので、私は例のように見えるかもしれないと推測しました。 "MyProperty"で検証する必要のある実際のプロパティにプロパティ "Value"を変更する必要があります。 –

+0

あなたに感謝!それは優雅に働いた。 –

0

ここで問題となっているのは、バリデーターの仕組みです。 StringLengthValidatorは、文字列が特定のパラメータ(最小および最大長)内にあることを要求します。しかし、このバリデータを置いているプロパティは文字列ではなく、それがあなたの問題です。タイプが一般的なT <>です。カスタムバリデーター属性を作成するために必要な検証属性を使用して、このプロパティーでソート文字列長の検証を行う場合は、

MVC例(MVC属性部分は必要ありません) - http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

一般的な例 - http://odetocode.com/Blogs/scott/archive/2011/02/21/custom-data-annotation-validator-part-i-server-code.aspx

関連する問題