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????
}
}
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();
}
}
Ce code est déconseillé: RuleFor(x => x.Guitars).SetCollectionValidator(new GuitarValidator());
C'est nouveau:
RuleForEach(x => x.Guitars).SetValidator(new GuitarValidator());
Il fonctionne avec la dernière version de Fluent et contient un exemple complet à utiliser.
Le code dans la réponse est obsolète.
RuleForEach(
itemToValidate =>
new YourObjectValidator());
public class YourObjectValidator : AbstractValidator<YourObject>
{
public EdgeAPIAddressValidator()
{
RuleFor(r => r.YourProperty)
.MaximumLenght(100);
}
}
Il fonctionne avec la dernière version de Fluent.