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?
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
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