5

int などの null 許容プロパティの検証を考え出そうとしています。

[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }

ただし、Agenull に設定した場合、範囲内にないために検証が失敗します。[ValidatorComposition(CompositionType.Or)]同様に必要であることはわかっていますが、他に何を使用すればよいでしょうか?

4

3 に答える 3

7

属性を追加することはできますが、検証結果が返されるときIgnoreNullsに複雑になります。ValidationResultsこれは、検証ブロックが暗黙的にバリデーターをラップするためですOrCompositeValidator。プロパティは null にすることも、指定された範囲の整数にすることもできます。

検証が失敗した場合、最上位の検証結果はOrCompositeValidator. 実際の検証結果を取得するには、オブジェクトのプロパティにRangeValidatorドリルダウンする必要があります。NestedValidationResultsValidationResult

これは検証結果メッセージを処理するのに大変な作業のように思えるので、もっと良い方法が必要だと私には思えました。

これが私がしたことです。

  1. IgnoreNullStringLengthValidatorを継承するというクラスを作成しましたStringLengthValidator(ここでは を継承しますRangeValidator)。
  2. 基本コンストラクターをサポートするために必要なすべてのコンストラクターを作成します。
  3. メソッドをオーバーライドDoValidateし、null 値をチェックします。ここでは、次のように記述します。

    if (!objectToValidate.HasValue) return;
    
  4. コードの次の行が を呼び出していることを確認してくださいbase.DoValidate(...)
  5. IgnoreNullStringLengthValidatorAttributenew を返すという属性クラスを作成しましたIgnoreNullStringLengthValidator。ここで、IgnoreNullRangeValidatorAttributeクラスを作成します。

結果として得られる検証結果は、バリデーターを暗黙的にネストしないため、期待どおりのものになります。

于 2010-06-16T19:29:13.220 に答える
5

IgnoreNulls 属性を追加できます。

[IgnoreNulls()]
[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
于 2009-01-20T06:41:34.410 に答える
1

はい、しかし、それがRangeValidator原因である場合ValidationResult、何らかの理由で2つValidationResultsになります... 1つは範囲検証の問題に正しく対応していますが、別の不可解なものは次のように述べています:

値が null ではなく、キー Age のすべての検証ルールに失敗しました。

これはばかげています。IgnoreNullsバリデーターが検証結果を引き起こすことは絶対に望んでいません! 他のものを変更するために本当にそこにあるのですね。これを、ポリモーフィズムを使用するときの実際の検証の継承と機能の欠如、および他の非常に多くのことに加えて、VAB属性には非常に多くの「小さな」問題があるため、些細なことを超えて使用できないことがわかります。

于 2009-11-09T20:04:43.153 に答える