使用FluentValidation验证2个列表

Sco*_*ard 5 c# validation

如果有人有使用[C#] FluentValidation的经验,并对下面的问题有任何想法,任何帮助将不胜感激.

我有2个通用列表(都带有字符串数据类型) - "名称"和"URL".它们都具有相同数量的项目,因此索引项目匹配,即名称[0]与Urls [0]相关联.

我遇到的唯一问题是验证每个列表中的空项.我需要的规则是:

如果某个项目在名称[2]中为空,则Url [2]不应为空.如果Url [2]中的项目为空,则Name [2]不应为空.如果它们都是空的那么我们不想验证,我们想忽略.

注意:我在上面的例子中使用了索引2,但它可以是任何东西

到目前为止,我有:

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.")
Run Code Online (Sandbox Code Playgroud)

这检查两个列表中没有项是空的,但是如果另一个列表中的相关项也为空(如果两者都为空,那么我们只想忽略它),我需要能够在一个列表中不验证项为空. .

有任何想法吗?

Sco*_*ard 9

最后我用下面的代码FluentValidation检查每个列表中的项目corrosponding,非常感谢Guvante因为它是由他的伪代码启发:)

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.");
Run Code Online (Sandbox Code Playgroud)