web-dev-qa-db-fra.com

FluentValidation - Validation d'un modèle de vue qui contient une liste d'un objet

J'essaie FluentValidation sur un projet qui contient des modèles de vue complexes et j'ai lu la documentation ici mais je ne vois pas comment configurer les règles pour valider une liste d'objets déclarés dans mon modèle de vue. Dans mon exemple ci-dessous, la liste dans le modèle de vue contient 1 ou plusieurs objets Guitar. Merci

Voir le modèle

 [FluentValidation.Attributes.Validator(typeof(CustomerViewModelValidator))]
    public class CustomerViewModel
    {
        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Display(Name = "Phone")]
        public string Phone { get; set; }

        [Display(Name = "Email")]
        public string EmailAddress { get; set; }

        public List<Guitar> Guitars { get; set; } 
    }

Classe de guitare utilisée dans View Model

public class Guitar
{
    public string Make { get; set; }
    public string Model { get; set; }
    public int? ProductionYear { get; set; }
}

Afficher la classe du validateur de modèle

 public class CustomerViewModelValidator : AbstractValidator<CustomerViewModel>
    {


        public CustomerViewModelValidator()
        {
            RuleFor(x => x.FirstName).NotNull();
            RuleFor(x => x.LastName).NotNull();
            RuleFor(x => x.Phone).NotNull();
            RuleFor(x => x.EmailAddress).NotNull();
           //Expects an indexed list of Guitars here????


        }
    }
29
Slinky

Vous l'ajouteriez à votre CustomerViewModelValidator

RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());

Ainsi, votre CustomerViewModelValidator ressemblerait à ceci:

public class CustomerViewModelValidator : AbstractValidator<CustomerViewModel>
{
    public CustomerViewModelValidator()
    {
        RuleFor(x => x.FirstName).NotNull();
        RuleFor(x => x.LastName).NotNull();
        RuleFor(x => x.Phone).NotNull();
        RuleFor(x => x.EmailAddress).NotNull();
        RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());
    }
}

Ajouter le GuitarValidator ressemblerait à quelque chose comme:

public class GuitarValidator : AbstractValidator<Guitar>
{
    public GuitarValidator()
    {
        // All your other validation rules for Guitar. eg.
        RuleFor(x => x.Make).NotNull();
    }
 }
46
Jonathon Choo

Ce code est déconseillé: RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());

C'est nouveau:

RuleForEach(x => x.Guitars).SetValidator(new GuitarValidator());
21

Il fonctionne avec la dernière version de Fluent et contient un exemple complet à utiliser.

Le code dans la réponse est obsolète.

1
Nico Campisano
RuleForEach(
  itemToValidate => 
     new YourObjectValidator());


public class YourObjectValidator : AbstractValidator<YourObject>
{
  public EdgeAPIAddressValidator()
  {
     RuleFor(r => r.YourProperty)
         .MaximumLenght(100);
  }
}
1
Nico Campisano

Il fonctionne avec la dernière version de Fluent.

0
Nico Campisano