6

Estoy tratando de validar un modelo que contiene otros objetos con las reglas de validación utilizando los atributos System.ComponentModel.DataAnnotations estaba esperando la implementación MVC por defecto sería suficiente:Soporte para el modelo anidado y validación clase con ASP.NET MVC 2.0

var obj = js.Deserialize(json, objectInfo.ObjectType); 
if(!TryValidateModel(obj)) 
{ 
    // Handle failed model validation. 
} 

El objeto está compuesto de tipos primitivos pero también contiene otras clases que también usan DataAnnotications. De este modo:

public class Entry 
{ 
    [Required] 
    public Person Subscriber { get; set; } 

    [Required] 
    public String Company { get; set; } 
} 

public class Person 
{ 
    public String FirstName { get; set;} 

    [Required] 
    public String Surname { get; set; } 
} 

El problema es que la validación ASP.NET MVC única baja 1 nivel y sólo se evalúan las propiedades de la clase de nivel superior, como puede leerse en digitallycreated.net/Blog/54/deep -inside-asp.net-mvc-2-model-metadata-y-validación.

¿Alguien conoce una solución elegante para esto? He intentado xVal, pero parecen usar un patrón no recursivo (http://blog.stevensanderson.com/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/).

Alguien debe haber encontrado este problema antes ¿no? Anidar objetos en su modelo no parece tan extraño si está diseñando un servicio web.

+1

ModelState.IsValid por alguna razón está validando objetos anidados También, a diferencia de TryValidateModel. Confuso. – JustAMartin

Respuesta

1

Sugiero buscar Validación fluida de codeplex. Las reglas de validación están contenidas en una clase separada (similar a la forma en que trabajan NHibernate y Fluent NHibernate). Uno usa un lambda para especificar la propiedad para validar, apoyando las propiedades secundarias.

`

public class MaintainCompanyViewModelValidator : AbstractValidator<MaintainCompanyViewModel> 
    { 
     public MaintainCompanyViewModelValidator() 
     { 
      RuleFor(model => model.Company.ShortName) 
       .NotEmpty(); 
     } 

`

Cuestiones relacionadas