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

C# 如何强制验证摘要与FluentValidation一起显示?,c#,asp.net-mvc-3,fluentvalidation,C#,Asp.net Mvc 3,Fluentvalidation,我已经在ASP.NETMVC3项目中设置了FluentValidation。我有一个表单,它有两个输入。其中一个可以为空,但不能同时为空 以下是我所拥有的: RuleFor(x => x.username) .NotEmpty() .When(x => string.IsNullOrEmpty(x.email) == true) .WithMessage("Please enter either a username or email address") 这

我已经在ASP.NETMVC3项目中设置了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)
        .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);
    }
    // ...
}
这将从
属性向模型属性添加第一条错误消息(使其适应您的需要)。此外,您还必须执行
@Html.ValidationSummary(true)
以在验证摘要中仅显示模型级错误


第三个选项:将规则添加到
unused_属性
,并使用
@Html.validationsummary for(x=>x.unused_属性)
作为验证摘要

您的问题可以通过FluentValidation解决:

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

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

将。

从未尝试过,只是一个想法:
RuleFor(x=>x).Must(x=>!string.IsNullOrEmpty(x.email)和&!string.IsNullOrEmpty(x.username))…
为什么第一个选项只适用于一个规则?难道我不能在不影响它的情况下添加更多规则吗?因为在第一个选项中,您有
@Html.ValidationSummary()
,它显示了所有错误,包括属性特定的错误。我不介意在出现其他验证错误时显示验证摘要。我只是不想在两个都是空的时候显示单个的。所以呢?我提供的两种解决方案都不适合你?第二个怎么了?我不是在抱怨拉穆纳斯,只是说第一个对我来说很好。我已接受您的回答这对我不起作用,验证消息未在模型状态下显示。自定义方法似乎也过时了。我尝试使用RuleFor(x=>x).Custom,但签名与代码不匹配。
Custom(m => String.IsNullOrEmpty(m.Username) && String.IsNullOrEmpty(m.Email)
    ? new ValidationFailure("", "Enter either a username or email address.")
    : null);
ModelState.AddModelError("", "Enter either a username or email address.")