我已经在我的asp.net mvc 3项目中设置了fluentvalidation。我有一个有两个输入的表单。两者都可以为空,但不能同时为空。
以下是我所拥有的:

RuleFor(x => x.username)
    .NotEmpty()
    .When(x => string.IsNullOrEmpty(x.email) == true)
    .WithMessage("Please enter either a username or email address")

这正确地将错误直接放在“我的用户名”字段的上方。但是,当两个字段都为空时,我希望验证摘要显示消息
有办法吗?我一直在想,我可以在模型中创建一个未使用的字段,并在上面加上错误(如果其他两个字段为空)。
RuleFor(x => x.unused_field)
    .NotEmpty()
    .When(x => string.IsNullOrEmpty(x.email) == true && string.IsNullOrEmpty(x.username) == true)
    .WithMessage("Please enter either a username or email address")

但这样做感觉很尴尬。有没有一种方法可以将消息添加到验证摘要中?

最佳答案

我唯一能找到的参考资料是this
如果你的模型很简单,只有这个规则,那么这个规则就足够了:

RuleFor(x => x)
        .Must(x => !string.IsNullOrWhiteSpace(x.Email) || !string.IsNullOrWhiteSpace(x.UserName))
        .WithName(".") // This adds error message to MVC validation summary
        .WithMessage("Please enter either a username or email address");

只需将@Html.ValidationSummary()添加到您的视图中,您就可以开始了。
但如果你想对你的模型制定更多的规则,那么据我所知,我只能想到一种“老套”的方法:
在控制器操作中添加以下内容:
if (!ModelState.IsValid)
{
    if (ModelState["."].Errors.Any())
    {
        ModelState.AddModelError(string.Empty, ModelState["."].Errors.First().ErrorMessage);
    }
    // ...
}

这将把"."属性的第一条错误消息添加到model属性(使其适应您的需要)。此外,您还必须执行@Html.ValidationSummary(true)以在验证摘要中仅显示模型级错误。
第三个选项:将规则添加到unused_property并使用@Html.ValidationSummaryFor(x => x.unused_property)作为验证摘要

09-30 22:33