2009-11-23 4 views
5

si quelqu'un a beaucoup d'expérience en utilisant [C#] FluentValidation et a des idées pour la question ci-dessous toute aide serait très appréciée.Validez 2 listes en utilisant FluentValidation

J'ai 2 listes génériques (les deux avec le type de données string) - "Name" et "Url". Ils ont tous deux la même quantité d'éléments, donc les éléments indexés correspondent, c'est-à-dire, Names [0] est en corrélation avec Urls [0].

Le seul problème que j'ai est de valider des éléments vides dans chaque liste. Les règles dont j'ai besoin sont:

si un élément est vide dans Name [2] alors Url [2] ne doit pas être vide. si un élément est vide dans Url [2], Name [2] ne doit pas être vide. si elles sont toutes deux vides alors nous ne voulons pas valider, nous voulons ignorer.

Note: Je l'ai utilisé l'indice 2 dans l'exemple ci-dessus, mais il pourrait être quelque chose

Jusqu'à présent, j'ai:

RuleFor(f => f.Names).Must(d => d.All(s => !String.IsNullOrEmpty(s))) 
       .WithMessage("Names cannot be empty.") 

RuleFor(f => f.URLs).Must(urls => urls.All(s => !String.IsNullOrEmpty(s))) 
       .WithMessage("URLs cannot be empty.") 

Cela permet de vérifier qu'aucun élément sont vides ni sur la liste, cependant je dois pouvoir ne pas valider les éléments pour être vide dans une liste si l'élément corrélant dans l'autre est également vide (si les deux sont vides alors nous voulons juste l'ignorer).

Des idées?

Répondre

8

Je fini en utilisant le code suivant FluentValidation pour vérifier les éléments correpondant dans chaque liste, un grand merci à Guvante comme il a été inspiré par son code pseudo-:)

RuleFor(f => f.Names).Must((f, d) => 
      { 
       for (int i = 0; i < d.Count; i++) 
       { 
        if ((String.IsNullOrEmpty(d[i]) && 
         !String.IsNullOrEmpty(f.URLs[i]))) 
         return false; 
       } 

       return true; 
      }) 
      .WithMessage("Names cannot be empty."); 

      RuleFor(f => f.URLs).Must((f, u) => 
      { 
       for (int i = 0; i < u.Count; i++) 
       { 
        if ((String.IsNullOrEmpty(u[i]) && 
         !String.IsNullOrEmpty(f.Names[i]))) 
         return false; 
       } 

       return true; 
      }) 
      .WithMessage("URLs cannot be empty."); 
+1

Merci beaucoup de l'avoir posté. Je tirais mes cheveux. Cela fonctionne très bien si vous validez que la case à cocher a été cochée: 'RuleFor (x => x.AvailableCompanies) .Must ((f, d) => {return d.Find (h => h.Checked == true)! = null;}). WithMessage ("Veuillez sélectionner au moins une société") ' – brenjt

1

Voici un Pseudo-code d'une solution de force brute. (Je ne peux pas penser à une façon LINQ de faire des comparaisons indexées) Désolé pour le découpage de la syntaxe Fluent.

Must(Names.Length == URLs.Length).WithMessage("Names must be equal in size to URLs"); 
for (int i = 0; i < Name.Length; i++) 
{ 
    Must(string.IsNullOrEmpty(Names[i]) ^^ string.IsNullOrEmpty(URLs[i])).WithMessage("Either Name and URL must be non-empty, or both must be empty, index = " + i); 
} 

Espérons que vous obtenez l'essentiel de celui-ci, vous pouvez aussi regarder dans les méthodes générales LINQ, il y a un risque que je manqué. Fondamentalement, vous voulez faire une jointure, puis vérifier les résultats invalides dans la liste fusionnée, mais encore une fois, je ne sais pas comment faire une rangée par rangée et pas simplement un nombre de jointure à plusieurs.

+0

@Guvante: Merci, votre pseudo- Le code a permis à la balle de rouler dans la bonne direction (voir la réponse affichée). +1 pour vous :) – Scozzard