6

Ich versuche, ein Modell, die anderen Objekte mit Validierungsregeln zur Validierung mit Hilfe der System.ComponentModel.DataAnnotations Attribute wurde die Standard-MVC Implementierung der Hoffnung, würde genügen:Unterstützung für verschachteltes Modell und Klasse Validierung mit ASP.NET MVC 2.0

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

Das Objekt besteht aus primitiven Typen, enthält aber auch andere Klassen, die ebenfalls DataAnnotications verwenden. Wie so:

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

Das Problem ist, dass die ASP.NET MVC Validierung nur um 1 Level geht und wertet nur die Eigenschaften der Top-Level-Klasse, wie auf digitallycreated.net/Blog/54/deep gelesen werden -inside-asp.net-mvc-2-model-Metadaten-und-Validierung.

Kennt jemand eine elegante Lösung? Ich habe versucht, xVal, aber sie scheinen ein nicht-rekursives Muster (http://blog.stevensanderson.com/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/) zu verwenden.

Jemand muss in dieses Problem vor richtig geraten haben? Das Verschachteln von Objekten in Ihrem Modell erscheint nicht sonderlich komisch, wenn Sie einen Webdienst entwerfen.

+1

ModelState.IsValid aus irgendeinem Grund auch verschachtelte Objekte ist die Validierung, im Gegensatz zu TryValidateModel. Verwirrend. – JustAMartin

Antwort

1

Ich empfehle Fluent Validierung von Codeplex. Die Validierungsregeln sind in einer separaten Klasse enthalten (ähnlich wie NHibernate und Fluent NHibernate). Man verwendet ein Lambda, um die zu validierende Eigenschaft anzugeben und untergeordnete Eigenschaften zu unterstützen.

`

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

`