使用FluentValidation验证2个列表

时间:2009-11-23 22:31:58

标签: 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.")

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

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

我最终使用以下FluentValidation代码检查每个列表中的相应原子,非常感谢尤文图斯,因为它受到了他的伪代码的启发:)

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 :(得分:1)

这是一些蛮力解决方案的伪代码。 (我无法想到任何LINQ方式进行索引比较)很抱歉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);
}

希望你得到它的要点,你可能也想看看一般的LINQ方法,可能有一个我错过了。基本上你想要进行连接,然后在合并列表中检查无效结果,但我再次不确定如何逐行进行,而不仅仅是多对多连接。