【问题标题】:How do I force a validation summary to appear with FluentValidation?如何使用 FluentValidation 强制显示验证摘要?
【发布时间】:2023-03-05 11:20:01
【问题描述】:

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

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

【问题讨论】:

  • 从未尝试过,只是一个想法:RuleFor(x => x).Must(x => !string.IsNullOrEmpty(x.email) && !string.IsNullOrEmpty(x.username))...

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


【解决方案1】:

我能找到的唯一参考是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);
    }
    // ...
}

这会将来自"." 属性的第一条错误消息添加到模型属性(根据您的需要进行调整)。此外,您必须执行@Html.ValidationSummary(true) 才能在验证摘要中仅显示模型级别的错误。

第三个选项:将规则添加到 unused_property 并使用 @Html.ValidationSummaryFor(x => x.unused_property) 作为验证摘要

【讨论】:

  • 为什么第一个选项只适用于一个规则?在那之后我不应该能够添加更多规则而不影响它吗?
  • 因为在第一个选项中您有@Html.ValidationSummary(),它显示了所有您遇到的错误,包括特定于属性的错误
  • 我不介意出现 other 验证错误时显示的验证摘要。我只是不希望在两者都为空时显示单个的。
  • 所以?我提供的解决方案都不适合您吗?第二个有什么问题?
  • 我并没有抱怨 Ramunas,只是说第一个对我来说可以。我接受了你的回答
【解决方案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.")

会的。

【讨论】:

  • 这对我不起作用,验证消息没有出现在模型状态中。 Custom 方法似乎也已过时。我尝试使用 RuleFor(x => x).Custom 但签名与您的代码不匹配。
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2020-02-17
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多