2016-09-20 7 views
0

プロパティを持つクラスが与えられ、FooExistsなどのカスタムバリデータを記述すると、FooExistsの機能の中で隣接する検証デコレータを表示できます。よりスマートなことがなければ、私は代わりにやっていなければなりません。近接バリデータについて知っているC#クラスプロパティバリデータ

私はさまざまなクラスのプロパティの上にスローするカスタムバリデータを持っています。場合によっては、[Required]とペアリングします。

が必要でないシナリオでは、をオーバーライドしたIsValid内で確認して、別の方法で処理したいと考えています。

public class ExampleDTO 
{ 
    [Required] 
    [FooExists] 
    public string Foo { get; set; } 

    public string Bar { get; set; } 
} 

public class AnotherExampleDTO 
{ 
    [FooExists] 
    public string Foo { get; set; } 

    public bool IsMoo { get; set; } 
} 

[AttributeUsage(AttributeTargets.Property)] 
sealed public class FooExistsAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     // ideally I could check if this property is required via [Required] 

     // look things up in the database, return true or false 
     return true; 
    } 
} 

すべてこのため、この理由は、私はExampleDTOを受け、コントローラにPOSTを行う場合、fooが(必須)存在するように検証し、その値は(FooExists)合法であるということであろう、です。しかし、私がAnotherExampleDTOを受け取るコントローラにPOSTを行い、Fooパラメータを省略した場合(必須ではないため)、私はそれを失敗させたくありません。FooExists。 FooExistsはnullであるかどうかを確認できますが、実際には「必要でない場合はNULLを返し、true、true」を返します。

私は[FooExists(Required=true)]

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] 
sealed public class FooExistsAttribute : ValidationAttribute 
{ 
    public bool Required { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (!Required && value == null) 
      return true 

     // look things up in the database, return true or false 
     return true; 
    } 
} 

しかし、これは間違っていると感じ、言及しないようにできるように、私は自由[Required]エラーメッセージを失い、自分の必要なプロパティを追加することで周りにおもちゃにしています。

私も自分のDTOにIValidatableObjectを継承したモデルでこれを入れて(この場合)を避けるためにしようとしている:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    // I could check all of the class properties in here 
} 
+0

FluentValidationをチェックしてください。カスタム属性を扱わなくてもいいかもしれません。 – PmanAce

答えて

1

短い答え:いいえ

長い答えを:あなたはこれを得ることができますいくつかのカスタムコードとリフレクションで動作しますが、そのような場合には必要ありません。

[Required]属性を使用すると、空文字列かヌル文字列かを指定できます。また、文字列の検証も行います。整数を検証するには、Rangeが必要です。

を参照してください:あなたは整数値で作業しているのでRequiredAttribute on MSDNRangeAttribute on MSDN

あなたの例から、[FooExists]は私が言ったように、全く役に立ちません。フィールドが必須ではない場合、属性はまったく必要ありません。

+0

値が削除されたか、もはやアクティブではない場合、Rangeは通知しません。 –

+0

ええ、それは文字列だったはずです。編集されました。 – Jared

+0

これを受け入れるが、appending:私の解決策は、プロパティの値がnullの場合、カスタムバリデーターにtrueを返すことでした。 nullを渡したくない場合は、[CustomValidator]タグに加えて[Required]タグを使用する理由があります。 – Jared

関連する問題