如何强制验证摘要与FluentValidation一起显示?

时间:2013-11-12 11:48:39

标签: c# asp.net-mvc-3 fluentvalidation

我在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")

但这感觉就像是一种尴尬的方式。有没有办法可以在验证摘要中添加消息?

2 个答案:

答案 0 :(得分:6)

我能找到的唯一参考是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()添加到您的视图中,就可以了。

但如果你要在你的模型上加入更多规则,那么据我所知,我只能想到一种“hacky”方式:
在你的控制器动作中添加:

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)作为验证摘要

答案 1 :(得分:2)

您的问题可以通过FluentValidation AbstractValidator.Custom来解决:

Custom(m => String.IsNullOrEmpty(m.Username) && String.IsNullOrEmpty(m.Email)
    ? new ValidationFailure("", "Enter either a username or email address.")
    : null);

ValidationFailure构造函数中的空字符串确保验证消息未绑定到任何输入字段,因此它出现在验证摘要中,如

ModelState.AddModelError("", "Enter either a username or email address.")

那样。