Estoy intentando validar objetos anidados (no modelos en los MVC sens) usando anotaciones y algunos códigos personalizados.Validación recursiva usando anotaciones y IValidatableObject
me encontré con el siguiente post útil
Using Data Annotations Validation Manually and Object Graphs
Como se sugiere en una respuesta, he creado una rutina adicional en la clase de contenedor para validar el objeto anidado. Aquí está mi código de prueba modificado
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;
}
}
Sin embargo tengo problemas para conseguir todos los errores de validación, incluso cuando se llama a TryValidateObject con validateAllProperties establecidas en true.
var context = new ValidationContext(cs, null, null);
var results = new List<ValidationResult>();
Validator.TryValidateObject(cs, context, results,true);
Si hay algún error en el contenedor, solo se mostrarán. Solo cuando no haya errores en el objeto contenedor, se mostrarán los errores en el objeto anidado. Sospecho que tiene algo que ver con Validate Rouine devolviendo una lista completa, y no pudiendo agregar a una lista (existente) desde el contenedor (?)
¿Hay alguna modificación que pueda hacer en la rutina para obtener todo errores para mostrar?
, si he entendido bien, "validateAllProperties" sólo afectará a las propiedades anotadas, no una rutina separada Validar Ok? Pero intenté implementar tu rutina, pero tengo problemas con lo que dejaste como TODO. Como ValidateRelatedObject devuelve un solo ValidationResult, (para una sola propiedad anotada), ¿cómo puedo hacer que envíe una posible lista de errores (desde el objeto anidado) a la lista de posibles errores de los objetos del contenedor? El ejemplo original parecía más prometedor a este respecto ya que devolvía una lista. ¡Su ayuda es muy apreciada! – goorj
En mi proyecto simplemente enumero todos los errores ValidationResult y Merge en una cadena, separados por una nueva línea. Más tarde, cuando necesito usarlo, simplemente dividí el error en varias líneas. También podría considerar la creación de una clase como MultiValidationResult que almacenará el ValidationResult real y expondrá el error concatenado. – surfen