2011-12-17 19 views
9

アノテーションとカスタムコードを使用して、ネストされたオブジェクト(MVCのモデルではないモデル)を検証しようとしています。アノテーションとIValidatableObjectを使用した再帰的検証

の回答で示唆したように、私は

Using Data Annotations Validation Manually and Object Graphs

次のポストが有用であることが判明、私は、ネストされたオブジェクトを検証するためのコンテナクラスで余分なルーチンを作成しました。ここに私の変更のテストコード

public class Customer : IValidatableObject 
{ 
    public Customer() 
    { 
     Details = new CustomerDetails(); 
    } 

    [Required] 
    [MaxLength(2)] 
    public string Name 
    { 
     get; 
     set; 
    } 

    public CustomerDetails Details 
    { 
     get; 
     private set; 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items); 
     var results = new List<ValidationResult>(); 
     Validator.TryValidateObject(this.Details, context, results); 
     return results; 
    } 
} 

だしかし、私はtrueに設定validateAllPropertiesでTryValidateObjectを呼び出す場合でも、すべて検証エラーを取得問題を抱えています。

 var context = new ValidationContext(cs, null, null); 
     var results = new List<ValidationResult>(); 
     Validator.TryValidateObject(cs, context, results,true); 

コンテナにエラーがある場合は、これらのみが表示されます。コンテナオブジェクトにエラーがない場合にのみ、ネストされたオブジェクトのエラーが表示されます。私はそれが完全なリストを返す検証ルーチンと関係があり、コンテナ(?)から(既存の)リストに追加することができないと思われる

すべてを得るために私が作ることができる変更はありますかエラーが表示されますか?

答えて

5

この回答を参照してください:https://stackoverflow.com/a/3400627/724944

だから、あなたのクラスのatributesに誤りがあり、したがって、Validateメソッドが呼び出されません。

[CustomValidation(typeof(Customer), "ValidateRelatedObject")] 
public CustomerDetails Details 
{ 
    get; 
    private set; 
} 

public static ValidationResult ValidateRelatedObject(object value, ValidationContext context) 
{ 
    var context = new ValidationContext(value, validationContext.ServiceContainer, validationContext.Items); 
    var results = new List<ValidationResult>(); 
    Validator.TryValidateObject(value, context, results); 

    // TODO: Wrap or parse multiple ValidationResult's into one ValidationResult 

    return result; 

} 
+0

[OK]を私が正しくあなたを理解していれば、「validateAllPropertiesは」のみ注釈付きプロパティに影響を与える、ない独立した検証ルーチン: 私はこのようなCustomValidationAttributeを使用することをお勧め?しかし、私はあなたのルーチンを実装しようとしましたが、私はあなたがTODOとして残したものに問題があります。 ValidateRelatedObjectは単一のValidationResult(単一の注釈付きプロパティ)を返しますが、どのようにして潜在的なエラーリスト(入れ子オブジェクトから)をコンテナオブジェクトの潜在的なエラーのリストにプッシュすることができますか?元の例は、リストを返すにつれて、この点でより有望と思われました。あなたの助けが大いにありがとう! – goorj

+0

私のプロジェクトでは、すべてのValidationResultとMergeエラーを、改行で区切られた1つの文字列に単純に列挙します。後で、私はそれを使う必要があるとき、私はエラーを複数の行に分割しました。実際のValidationResultを格納し、連結エラーを公開するMultiValidationResultのようなクラスを作成することも考えられます。 – surfen