2017-09-18 27 views
0

J'ai essayé de trouver un moyen de valider des éléments dans une liste, chacun avec des règles de validation différentes. Je suis tombé sur la validation Fluent qui est une excellente bibliothèque mais je n'arrive pas à trouver un moyen de faire la validation de chaque élément individuellement. J'ai eu une idée vague de ce fil similaire (Validate 2 list using fluent validation), mais je ne suis pas sûr de savoir comment le concentrer comme je le veux.Validation fluide, validation différente pour chaque élément dans une liste dans Asp.NET Core

J'ai donc ce modèle Voir:

public class EditPersonalInfoViewModel 
{ 
    public IList<Property> UserPropertyList { get; set; } 
} 

Il contient une liste de propriétés Active Directory. Chaque représenté par cette classe:

public class Property 
{ 
    public string Name { get; set; } 
    public UserProperties Value { get; set; } 
    public string input { get; set; } 
    public bool Unmodifiable { get; set; } 
    public string Type { get; set; } 
} 

Le point est que, chaque propriété AD a des contraintes différentes, donc je veux spécifier des règles différentes pour chaque propriété dans la liste en quelque sorte comme ceci:

public class ADPropertiesValidator : AbstractValidator<EditPersonalInfoViewModel> 
{ 
    public ADPropertiesValidator() 
    { 
     RuleFor(p => p.UserPropetyList).Must((p,n) => 
     { 
       for (int i = 0; i < n.Count; i++) 
        { 
        if ((n[i].Name.Equals("sAMAccountName")) 
         { 
          RuleFor(n.input).NotEmpty().... 
         } 
        else if(...) 
         { 
         //More Rules 
         } 
        } 
     ) 

    } 
} 

Des idées comment aborder cela? Merci d'avance.

Répondre

1

Vous approchez de la validation du mauvais point de vue. Au lieu de créer des conditions de validation dans votre classe de conteneur de collecte, il suffit de créer un validateur spécifique pour votre classe Property, puis l'utiliser dans votre ADPropertiesValidator:

public class ADPropertyValidator : AbstractValidator<Property> 
{ 
    public ADPropertyValidator() 
    { 
     When(p => p.Name.Equals("sAMAccountName"),() => 
     { 
      RuleFor(p => p.input) 
       .NotEmpty() 
       .MyOtherValidationRule(); 
     }); 

     When(p => p.Name.Equals("anotherName"),() => 
     { 
      RuleFor(p => p.input) 
       .NotEmpty() 
       .HereItIsAnotherValidationRule(); 
     }); 
    } 
} 

public class ADPropertiesValidator : AbstractValidator<EditPersonalInfoViewModel> 
{ 
    public ADPropertiesValidator() 
    { 
     RuleForEach(vm => vm.UserPropertyList) 
      .SetValidator(new ADPropertyValidator()); 
    } 
} 
+0

ahh! J'ai vu quelque chose de similaire dans un autre post mais j'ai pensé que ça ne marcherait pas. Quoi qu'il en soit, cela fonctionne parfaitement! Merci! – Enixf