6

Je suis en train de valider un modèle contenant d'autres objets avec des règles de validation en utilisant les attributs de System.ComponentModel.DataAnnotations esperait l'implémentation par défaut MVC suffirait:support pour le modèle imbriqué et validation de classe avec ASP.NET MVC 2.0

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

L'objet est composé de types primitifs mais contient également d'autres classes qui utilisent également DataAnnotications. Comme si:

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

Le problème est que la validation ASP.NET MVC ne va que vers le bas niveau 1 et évalue uniquement les propriétés de la classe de haut niveau, comme on peut le lire sur digitallycreated.net/Blog/54/deep -inside-asp.net-mvc-2-modèle-métadonnées-et-validation.

Est-ce que quelqu'un connaît une solution élégante à cela? J'ai essayé xVal, mais ils semblent utiliser un modèle non récursif (http://blog.stevensanderson.com/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/).

Quelqu'un doit avoir rencontré ce problème avant d'avoir raison? Imbrication d'objets dans votre modèle ne semble pas si étrange si vous concevez un service Web.

+1

ModelState.IsValid pour une raison quelconque est aussi des objets imbriqués valider, contrairement TryValidateModel. Déroutant. – JustAMartin

Répondre

1

Je suggère de regarder dans Fluent Validation à partir du codeplex. Les règles de validation sont contenues dans une classe séparée (similaire à NHibernate et Fluent NHibernate). On utilise un lambda pour spécifier la propriété à valider, supportant les propriétés enfants.

`

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

`