4

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

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

4

2 回答 2

6

我能找到的唯一参考是这个

现在,如果您的模型如此简单并且这条规则是唯一的,那么这条规则就足够了:

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

于 2013-11-12T17:46:23.653 回答
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.")

将。

于 2014-11-22T16:14:53.037 回答