Asp.net 显示除Fluent验证中定义的错误消息以外的详细错误消息

Asp.net 显示除Fluent验证中定义的错误消息以外的详细错误消息,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,fluentvalidation,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Fluentvalidation,我使用的是ASP.NET MVC 4和最新版本的Fluent Validation。我在数据注释上使用流畅的验证 我正在考虑将验证错误摘要添加到要输入数据的视图中。我目前只对每个输入字段使用ValidationMessageFor。有时,我需要在表单验证为true之后执行其他验证(如针对服务),然后在验证失败时在视图上显示这些消息。由于此验证与任何输入字段都不相关,我希望在验证错误摘要中显示此错误 以“我的员工编号”字段为例,它是必填字段,长度不能超过10个字符。我有以下使用Fluent验证的验

我使用的是
ASP.NET MVC 4
和最新版本的
Fluent Validation
。我在数据注释上使用流畅的验证

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

以“我的员工编号”字段为例,它是必填字段,长度不能超过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");
     }
}
这部分很好用。如果文本框为空,则在文本框旁边显示“必需”错误消息;如果文本框超过10个字符,则显示“不得超过10个字符”错误消息

现在我想将我的验证错误摘要添加到视图中。我补充说:

@Html.ValidationSummary(true, "Errors have occurred while. Fix the errors before saving.")
我想它显示一些体面的错误信息有关的控制上面。虽然如果员工编号为空,它会在员工编号旁边显示“Required”,但我希望它在验证错误摘要中显示类似“employee number is Required”的内容。当前,它只显示文本“错误已发生,请在保存前修复错误。”

当我需要在表单验证为true之后进行其他验证时,比如检查员工是否是有效员工,那么我也希望显示此错误消息。如果我的控制器的动作方法中有此项:

ModelState.AddModelError("", "My test error message");
我希望在验证错误摘要中显示“我的测试错误消息”


这样的事情怎么可能呢?

您应该这样设置它

@Html.ValidationSummary(false)
假设您没有在客户端进行验证,或者验证失败,当您提交表单时,您的控制器中有这些错误。然后,您可以像现在添加错误一样添加更多错误:

ModelState.AddModelError("", "My test error message");
当视图被渲染回客户端时,它将包含来自模型属性的错误消息以及自定义消息

更新:

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

假设模型有一个名为
EmployeeNumber
的属性,如问题所示。表单被提交回来,并在服务器端使用Brendan设置的自定义验证器进行验证。一切都很好。现在,我们可以使用反射并检查模型的属性,发现modelstate字典中是否存在错误,使用属性名称并在某个错误集合对象中查找它(可以是资源文件或数据库,所有方法都是一样的)

现在,通过执行以下操作,确保从摘要中排除属性错误:

@Html.ValidationSummary(true)
因此,现在除了错误控件和摘要中的(非常)长的错误消息之外,您还可以享受一个简短的错误。

@Html.ValidationSummary(true)-->Correct

  • 不会同时显示默认错误消息
  • 只需编写下面的语句,就可以显示自定义消息
    ModelState.addmodeleror(“,”此帐户未在我们的系统中注册。“)
  • 类中定义的所有注释消息将整齐地显示在控件旁边

  • 这应该已经奏效了。那么,附加的错误消息没有显示在摘要中吗?它显示的是来自控制器的错误消息,但如果表单验证为false,我将尝试将详细的错误消息获取到验证摘要中。这样做将在摘要中显示“必需”。“Required”没有任何含义,我希望在摘要中显示一条描述性错误消息,如“Employee number is Required”。控件旁边的“Required”是可以的。修改验证器是一个选项吗?像这样:
    .WithMessage(“需要员工号码”)
    ?如果是这样的话,那就行了。如果没有,那么我很抱歉我的回答是不够的。是的,这样就可以了,但我不希望在我的控制下有这么长的消息。我可以。一定有办法做到这一点:)你的答案是可以的。如果做不到这一点,那就不是世界末日。啊,我想我更明白你想做什么。这是可以做到的,但需要一点技巧。您可以做的是读取modelstatedictionary,然后查找字段是否有错误。然后提供该错误的较长版本,将其作为自定义错误添加。然后使用validationsummary排除属性错误(
    @html.validationsummary(true)
    )。
    [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)