C# 如何强制验证摘要与FluentValidation一起显示?
我已经在ASP.NETMVC3项目中设置了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") 这
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.")