2011-12-17 14 views
9

Sto provando a convalidare oggetti nidificati (non modelli nei sensi MVC) usando annotazioni e qualche codice personalizzato.Convalida ricorsiva usando annotazioni e IValidatableObject

ho trovato il seguente post utile

Using Data Annotations Validation Manually and Object Graphs

Come suggerito in una risposta, ho creato una routine in più nella classe contenitore per convalidare l'oggetto nidificato. Ecco il mio codice di prova modificato

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; 
    } 
} 

Tuttavia ho problemi a far tutte gli errori di validazione, anche quando si chiama TryValidateObject con validateAllProperties impostate su true.

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

Se ci sono errori nel contenitore, solo questi mostreranno. Solo quando non ci sono errori nell'oggetto contenitore, verranno visualizzati errori nell'oggetto nidificato. Sospetto che abbia qualcosa a che fare con il Validate rouine che restituisce un elenco completo e che non è in grado di aggiungere a un (esistente) elenco dal contenitore (?)

Ci sono delle modifiche che posso apportare alla routine per ottenere tutto errori da mostrare?

risposta

5

Vai a questa risposta: https://stackoverflow.com/a/3400627/724944

Quindi, c'è un errore nei atributes della classe, e quindi metodo Validate non viene chiamato. Io suggerisco di usare CustomValidationAttribute come questo:

[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, se ho capito bene, "validateAllProperties" interesseranno solo le proprietà annotate, non una routine Convalida separata? Ma ho provato a implementare la tua routine, ma ho problemi con quello che hai lasciato come TODO. Poiché ValidateRelatedObject restituisce un singolo ValidationResult, (per una singola proprietà annotata), come posso spingere un potenziale elenco di errori (dall'oggetto nidificato) nell'elenco di potenziali errori dagli oggetti contenitore? L'esempio originale mi è sembrato più promettente in quanto ha restituito una lista. Il tuo aiuto è molto apprezzato! – goorj

+0

Nel mio progetto ho semplicemente elencato tutti gli errori ValidationResult e Merge in una stringa, separati da una nuova riga. Più tardi, quando ho bisogno di usarlo, ho diviso l'errore in più righe. Si potrebbe anche prendere in considerazione la creazione di una classe come MultiValidationResult che archivierà ValidationResult e esporrà l'errore concatenato. – surfen

Problemi correlati