2011-11-15 9 views
5

私のプロジェクトではFluent Validationを使用しています。
私のViewModelには文字列型のプロパティがあり、有効な値は正の整数を表す文字列だけです。
したがって、文字列を整数に解析できるかどうかを確認する単純なIntegerValidatorを作成しました。これは機能します。
問題は、正の整数でなければならないというルールを追加する方法ですか?既存のGreater Than Validatorを使用したいのですが、文字列プロパティのルールにチェーンすると、stringと解釈され、構文解析されたintとしては比較されません。これを達成する方法は?私は(ToInt()に注意してください)したいと思っ何のお互いに依存する連鎖規則

サンプル:

RuleFor(x => x.BatchNumber).SetValidator(new IntegerValidator()) 
          .ToInt().GreaterThan(0); 
+0

これは本当に理にかなっています!しかし、私はToIntの役割がどんなものでなければならないのだろうか。私が見ているように、 'RuleBuilder 'を 'RuleBuilder 'に変換し、検証時に検証された値が 'int'に変換されていることを確認する必要があります。しかし、メソッドチェーンは 'RuleBuilder 'を返すべきです。右?ですから、連続した 'int'ルール(' GreaterThan'のような)に 'int'バリデーションを行うよう指示し、' string'ルールビルダを返す方法がなければなりません。私はこれがFluentValidationの現在の能力を超えていることを恐れています。 –

+0

@GertArnold:まあ、「ToInt」はあまり意味がないと思います。私は実際にはどうしたらうまくいくのですか?GreaterThanを使うことができ、intはGreaterThanに渡されます。 –

+0

私の主なポイントは、Fluent Validationの現在の考え方では概念的な問題かもしれないということです。 –

答えて

1

あなたはいつも...

RuleFor(x=>x.BatchNumber).Must(BeAPositiveIntegerString); 

private bool BeAPositiveIntegerString(string batchNumber) 
{ 
    // check both parse ability and greater than (once parsed) 
} 

あまり再利用性をカスタムメソッドを使用することができますが、働くだろう...

+0

確かに、私はそれを行うことができますが、疑問はありません。しかしそれはまさに私が避けたいもの、なぜ私が最初に尋ねたのかです。 –

+0

'RuleBuilder 'を 'RuleBuilder 'にキャストする方法が見つかりません。これらのクラスの階層構造は、FluentValidatorのコードを深く変更する必要がありますが、私はそれらに言及します。同様の使用例が見えます。この特定のケースでは(別の非回答を与えるために)、文字列の負の符号をチェックするバリデーターを常にチェーンすることができます。 ;) – drharris

関連する問題