1

我正在使用ASP.NET MVC 4最新版本的Fluent Validation. 我在数据注释上使用 Fluent Validation。

我正在考虑将验证错误摘要添加到要输入数据的视图中。我目前只使用ValidationMessageFor每个输入字段。有时我需要在表单验证为真后进行其他验证(例如针对服务),然后在验证失败时将这些消息显示在视图上。而且由于此验证与任何输入字段无关,因此我希望将此错误显示在验证错误摘要中。

让我们以我的员工编号字段为例,它是必需的,并且不能超过 10 个字符。我有以下使用流利验证的验证器类:

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");

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

这样的事情怎么可能发生?

4

2 回答 2

0

@Html.ValidationSummary(true) -->正确

  1. 不会一起显示默认错误消息。
  2. 您只需编写以下语句即可显示自定义消息 ModelState.AddModelError("", "This account is not registered in our system.");
  3. 类中定义的所有注释消息都将整齐地显示在控件旁边。
于 2013-05-23T17:23:42.203 回答
0

这就是你应该如何设置它

@Html.ValidationSummary(false)

假设您没有在客户端验证或验证失败,当您提交表单时,您的控制器中有这些错误可用。然后,您可以添加更多错误,就像现在添加它一样:

ModelState.AddModelError("", "My test error message");

当视图呈现回您的客户端时,它将包含来自模型属性的错误消息以及自定义消息。

更新:

Brendan 提到他想在每个错误控件之外显示一条短消息,并为同一个错误控件提供更长版本的错误消息,并在 ValidationSummary 中显示更长版本的错误消息。它可以通过一些 hack 来完成。

假设模型有一个属性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)

因此,除了错误的控件和摘要中的(非常)长的错误消息之外,现在您还可以享受短暂的错误。

于 2013-05-02T06:14:54.107 回答