c# - ASP.NET Core 模型验证错误以错误的顺序显示
问题描述
问题: 模型错误未根据模型定义显示,它们是随机显示的。
这发生在 ASP.NET 核心应用程序中。我在常规的 asp.net mvc 应用程序中从未遇到过这个问题。
我必须在 asp.net core razor 页面中启用任何设置吗?还是我完全做错了什么。请帮忙。
UI 显示 错误以随机格式显示:
- 出生日期是必需的
- 姓氏是必填项
- 儿童EI ID是必需的
- 名字是必填项
- 学区是必需的
- 需要推荐日期
视图模型定义:
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 });
}
解决方案
如果要对错误消息进行排序,则应定义排序条件。显然,您发现了不存在确定性顺序的情况。
如果您想按属性名称对错误进行排序,这应该是诀窍:
var modelStateErrors = this.ModelState.Keys.OrderBy(x => x).SelectMany(key => this.ModelState[key].Errors);
如果您希望键按其他标准排序,您可以创建一个属性来装饰属性并使用反射按该顺序对错误消息进行排序。
但是,在 2020 年,在输入表单下方出现这种错误消息列表的情况非常罕见。相反,您应该在无效输入表单字段的旁边(或下方)显示每个特定的错误消息。此外,您可以在 ul/li 摘要中显示所有没有键的 ModelState 错误(因为它们不能位于输入字段旁边)。如果您有不直接属于特定输入字段的验证错误,则可能会出现这种情况。
推荐阅读
- java - ObjectInputStream - 读取对象 - 有没有办法阻止调用无参数超类构造函数?
- javascript - 使用模式构建的突变中的对象数组 - Graphql - 问题
- c - 整数溢出与 C 中的乘法
- html - 使用 CSS 在两列之一中居中图像
- c - Codelite 无法正确下载?
- excel - 在页面的最后一行之后直接打印页脚
- html - 将 2 个元素(倒数计时器和按钮)并排放置在行中 - 它们不居中
- nginx - 安装在 nginx 上的 lucee 服务器的问题
- javascript - 如果从另一个模块调用该模块,为什么改变一个模块会更新引用,但如果从自身调用则不会?
- javascript - 如何使用js在链接悬停时显示背景图像