如果有人有使用[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.")
这检查两个列表中没有项是空的,但是如果另一个列表中的相关项也为空,我需要能够在一个列表中不验证项为空(如果两者都是空的那么我们只想忽略它。)
有什么想法吗?
答案 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方法,可能有一个我错过了。基本上你想要进行连接,然后在合并列表中检查无效结果,但我再次不确定如何逐行进行,而不仅仅是多对多连接。