我正在使用ASP.NET MVC 4
和Fluent Validation
的最新版本。我在数据注释上使用Fluent验证。
我正在考虑在我的视图中添加验证错误摘要,其中要输入数据。我目前只对每个输入字段使用ValidationMessageFor
。有时我需要在表单验证为真后执行其他验证(如针对服务),如果验证失败,则在视图上显示这些消息。并且因为此验证与任何输入字段无关,所以我希望在验证错误摘要中显示此错误。
让我们以我的员工编号字段为例,它是必需的,不能超过10个字符。我使用Fluent验证有以下验证器类:
public class CreateEmployeeViewModelValidator : AbstractValidator<CreateEmployeeViewModel>
{
public CreateEmployeeViewModelValidator()
{
RuleFor(x => x.EmployeeNumber)
.NotEmpty()
.WithMessage("Required")
.Length(1, 10)
.WithMessage("Must not be greater than 10 characters");
}
}
我的HTML标记:
@Html.TextBoxFor(x => x.EmployeeNumber)
@Html.ValidationMessageFor(x => x.EmployeeNumber)
这部分工作正常。如果文本框为空,则会在文本框旁边显示“必需”错误消息,如果超过10个字符,则显示“不得超过10个字符”错误消息。
现在我想将我的验证错误摘要添加到视图中。我添加了以下内容:
@Html.ValidationSummary(true, "Errors have occurred while. Fix the errors before saving.")
我希望它显示一些与上述控件相关的体面错误消息。虽然员工编号旁边显示“必需”,但如果它是空的,我希望它在验证错误摘要中显示类似“需要员工编号”的内容。目前它只显示文本“发生错误时。在保存之前修复错误。”。
当我需要在表单验证确认后进行其他验证时,例如检查员工是否是有效员工,那么我也希望显示此错误消息。如果我在控制器的操作方法中有这个:
ModelState.AddModelError("", "My test error message");
我希望在验证错误摘要中显示“我的测试错误消息”。
这样的事情怎么可能?
答案 0 :(得分:0)
这是你应该如何设置
@Html.ValidationSummary(false)
假设您未在客户端进行验证或验证失败,则在提交表单时,您的控制器中会出现这些错误。然后,您可以在添加错误时添加更多错误:
ModelState.AddModelError("", "My test error message");
当视图呈现回客户端时,它将包含模型属性中的错误消息以及自定义消息。
<强>更新强>
Brendan提到他希望在每个错误控件之外显示一条短消息,并为同一个错误控件提供更长版本的错误消息,并在ValidationSummary中显示更长版本的错误消息。它可以通过一些黑客来完成。
假设模型有一个名为EmployeeNumber
的属性,如问题所示。表单将被提交回来,并在服务器端使用Brendan设置的自定义验证器进行验证。一切都很好。现在我们可以使用反射并检查模型的属性,并查找模型状态字典中是否存在错误,使用属性名称并在某个错误集合对象中查找它(可能是资源文件或数据库,所有相同的方法)。
[HttpPost]
public ActionResult AcceptEmployee(EmployeeModel model)
{
// customErrors here is a dictionary
// that contains information for the custom message
// i.e. Key="EmployeeNumber", Message="Employee number is required"
// like I've mentioned this can be a query from the database
// or a get from a resource file
// for the sake of this example, I used a dictionary
foreach (var property in model.GetType().GetProperties())
{
if (ModelState[property.Name] !=null
&& ModelState[property.Name].Errors.Any())
{
ModelState.AddModelError("", customErrors[property.Name]);
}
}
}
现在确保通过执行以下操作从摘要中排除属性错误:
@Html.ValidationSummary(true)
所以现在除了错误的控件和摘要中的(非常)长的错误消息之外,你还可以享受一个简短的错误。
答案 1 :(得分:0)
@ Html.ValidationSummary(true) - &gt;更正
ModelState.AddModelError("", "This account is not registered in our system.");