2012-04-12 7 views
1

私はValidator.TryValidateObject()を使用してデータ注釈を使用するオブジェクトを検証しています。オブジェクトが無効な場合、コードは正常に実行されます。ただし、有効な場合は、スタックオーバーフローエラーが生成されます。オブジェクトが有効な場合、TryValidateObjectを使用したStackOverflow

public virtual IEnumerable<ValidationResult> Validate(ValidationContext vc) 
{ 
    vc = new ValidationContext(this, null, null); 
    List<ValidationResult> a = new List<ValidationResult>(); 

    Validator.TryValidateObject(this, vc, a,true); 

    foreach (var item in a) 
     yield return item; 

    if (Name == "Arbitary") 
     yield return new ValidationResult("Bad Name.", new[] { "Name" }); 

} 

TryValidateObjectが内部でも、私の方法Validateを呼び出しているようだ:

は、ここに私の方法です。この方法で

私の目標は、私のオブジェクトのすべてのDataAnnotationsを検証して、その後いくつかの複雑な検証ロジックに追加することです - ので、私はTryValidateObjectはその後、その後、私は私自身の検証ロジックを置くことができ、データの注釈をチェックすると仮定しました。

DataAnnotationsから生成されたValidationResultsをレポートし、名前が "Arbitary"の場合はValidationResultを追加しますが、データが有効な場合はこのstackoverflowを取得します。

アイデア?独自のValidateメソッドが呼び出されないように、オブジェクトのデータアノテーションを検証するにはどうすればよいですか?あるいは、このスタックオーバーフローを解決する方法は?

私のクラスはIValidatableObjectインターフェイスを実装していることに注意してください。

答えて

2

Validateから継承するのではなく、独自のデータ注釈属性を実装して、このSOの質問に従ってカスタム検証を実行できますか?

How to create Custom Data Annotation Validators

+1

おかげで、私はこれを行うかもしれないが、私は私のオブジェクトがそれを保存しようとする前に、データベースに受け入れられるかどうかを考え出すことができるようにしたい:(Model.Validate()であれば、 'のようなものを。 Count()== 0){Database.Save(Model);} '。現時点では、私はデータベースに 'Save()'しようとすると例外を 'キャッチする'必要があります。これはひどく非効率です。 – Oliver

+1

このアプローチを採用した場合でも、送信前にValidator.TryValidateObjectを手動で呼び出して確認できます。 – DaveRead

関連する問題