首页 > 解决方案 > ASP.NET Core 模型验证错误以错误的顺序显示

问题描述

问题: 模型错误未根据模型定义显示,它们是随机显示的。

这发生在 ASP.NET 核心应用程序中。我在常规的 asp.net mvc 应用程序中从未遇到过这个问题。

我必须在 asp.net core razor 页面中启用任何设置吗?还是我完全做错了什么。请帮忙。

UI 显示 错误以随机格式显示:

视图模型定义:

public class DocumentViewModel 
{
    [Required(ErrorMessage = "First Name is required")]
    [RegularExpression(@"^[a-zA-Z- ']+$", ErrorMessage = "First Name should not contain any special character or number.")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is required")]
    [RegularExpression(@"^[a-zA-Z- ']+$", ErrorMessage = "Last Name should not contain any special character or number.")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Child EI ID is required")]
    public int? ChildEIID { get; set; }

   [Required(ErrorMessage = "DOB is required")]
   [DataType(DataType.Date)]
    public DateTime? DOB { get; set; }

    [Required(ErrorMessage = "District is required")]
    public string District { get; set; }

    [Required(ErrorMessage = "Date Of Referral is required")]
    [DataType(DataType.Date)]
    public DateTime? DateOfReferral{ get; set; }

}

发布方法

 [HttpPost]
 [AutoValidateAntiforgeryToken]
    public ActionResult Documents(UploadDocumentViewModel viewModel)
    {


        //string errorMessages = "";
        if (!ModelState.IsValid)
        {
            return ModelErrors();
        }

        return Json(new { status = "success", message = "Documents Uploaded." });
    }

模型错误返回方法

private ActionResult ModelErrors()
    {
        var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);
        var message = "<ul>";

        foreach (var modelStateError in modelStateErrors)
        {
            message += "<li>" + modelStateError.ErrorMessage + "</li>";
        }
        message += "</ul>";
        return Json(new { status = "error", message = message });
    }

标签: c#asp.net-core

解决方案


如果要对错误消息进行排序,则应定义排序条件。显然,您发现了不存在确定性顺序的情况。

如果您想按属性名称对错误进行排序,这应该是诀窍:

var modelStateErrors = this.ModelState.Keys.OrderBy(x => x).SelectMany(key => this.ModelState[key].Errors);

如果您希望键按其他标准排序,您可以创建一个属性来装饰属性并使用反射按该顺序对错误消息进行排序。

但是,在 2020 年,在输入表单下方出现这种错误消息列表的情况非常罕见。相反,您应该在无效输入表单字段的旁边(或下方)显示每个特定的错误消息。此外,您可以在 ul/li 摘要中显示所有没有键的 ModelState 错误(因为它们不能位于输入字段旁边)。如果您有不直接属于特定输入字段的验证错误,则可能会出现这种情况。


推荐阅读