2010-09-30 10 views
3

J'ai quelques problèmes avec la validation en utilisant les annotations de données dans ASP.NET MVC 2. Par exemple, je adresse de classe:validation dans ASP.NET MVC 2

public class Address 
{ 
    public long Id { get; set; } 

    [Required] 
    public string City { get; set; } 

    [Required] 
    public string PostalCode { get; set; } 

    [Required] 
    public string Street { get; set; } 
} 

et la classe de commande:

public class Order 
{ 
    public long Id { get; set; } 

    public Address FirstAddress { get; set; } 

    public Address SecondAddress { get; set; } 

    public bool RequireSecondAddress { get; set; } 
} 

Je souhaite valider Order.FirstAddress tout le temps, mais Order.SecondAddress ne doit être validé que si Order.RequireSecondAddress est défini sur true.

Des idées? :)

Chris

Répondre

3

qui est proche de l'aide d'annotations données impossible ou nécessite l'écriture de code laid qui repose sur la réflexion, etc ... (je pense que vous obtenez le point). Je voudrais vous recommander en regardant le FluentValidation. Il a une bonne integration with ASP.NET MVC. Voici comment votre logique de validation pourrait ressembler à:

public class AddressValidator : AbstractValidator<Address> 
{ 
    public AddressValidator() 
    { 
     RuleFor(x => x.City) 
      .NotEmpty(); 
     RuleFor(x => x.PostalCode) 
      .NotEmpty(); 
     RuleFor(x => x.Street) 
      .NotEmpty(); 
    } 
} 

public class OrderValidator : AbstractValidator<Order> 
{ 
    public OrderValidator() 
    { 
     RuleFor(x => x.FirstAddress) 
      .SetValidator(new AddressValidator()); 
     RuleFor(x => x.SecondAddress) 
      .SetValidator(new AddressValidator()) 
      .When(x => x.RequireSecondAddress); 
    } 
} 

Vous bénéficierez également d'avoir une couche de validation séparée qui pourrait aussi être unit tested in a very elegant way.

+0

En FluentValidator il y a quelques problèmes dans le côté client avec des validations plus complexes, mais je pense que ce n'est pas gros problème. Maintenant, je vais en apprendre plus sur FluentValidator :) Merci! – Chris