Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validate 2 lists using FluentValidation

Tags:

c#

validation

if anyone has much experience using [C#] FluentValidation and has any ideas for the below question any help would be much appreciated.

I have 2 Generic Lists (both with string datatype) - "Name" and "Url". They both have the same amount of items, thus indexed items match up i.e., Names[0] correlates with Urls[0].

The only problem I am having is with validating empty items in each list. The rules i need are:

if an item is empty in Name[2] then Url[2] should not be empty. if an item is empty in Url[2] then Name[2] should not be empty. if they are both empty then we do not want to validate, we want to ignore.

note: I have used the index 2 in the above example but it could be anything

So far I have:

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.")

This checks that no items are empty in either list, however I need to be able to not validate items for being empty in one list if the correlating item in the other is also empty (If both are empty then we just want to ignore it).

Any ideas?

like image 881
Scott Avatar asked Nov 23 '09 22:11

Scott


1 Answers

I ended up using the following FluentValidation code to check the corrosponding items in each list, big thanks to Guvante as it was inspired by his Pseudo-code :)

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.");
like image 128
Scott Avatar answered Sep 27 '22 21:09

Scott