显示除Fluent验证中定义的错误消息之外的详细错误消息

时间:2013-05-02 05:50:26

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 fluentvalidation

我正在使用ASP.NET MVC 4Fluent 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");

我希望在验证错误摘要中显示“我的测试错误消息”。

这样的事情怎么可能?

2 个答案:

答案 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;更正

  1. 不会同时显示默认错误消息。
  2. 只需编写以下语句即可显示自定义消息 ModelState.AddModelError("", "This account is not registered in our system.");
  3. 班级中定义的所有注释消息将整齐地显示在控件旁边。