遍历ModelState中存储的错误信息
在服务器端验证中,有时我们添加了一个ModelError,然后还需要将该信息以JS的形式返回到客户端。如:
[HttpPost] public ActionResult Index(LogOnModel model) { if (string.IsNullOrEmpty(model.UserName)) { ModelState.AddModelError("UserName", "请输入用户名。"); return JavaScript("alert('请输入用户名')"); } if (string.IsNullOrEmpty(model.PassWord)) { ModelState.AddModelError("UserName", "请输入密码。"); return JavaScript("alert('请输入密码')"); } if (string.IsNullOrEmpty(model.CheckCode)) { ModelState.AddModelError("UserName", "请输入验证码。"); return JavaScript("alert('请输入验证码')"); } if (ModelState.IsValid) { Response.Write("asdf"); } return View(); }
这样重写一遍固然可以,但却做了重复的工作,如果我们能获取添加在ModelState中的错误信息,则可以省去不少的工作。
ModelState本身是一个字典,并且存储了验证失败的信息。具体被存储在ModelState.Values[i].Errors[j].ErrorMessage属性中。
ModelState的Errors属性存储了所有验证失败信息,是一个ModelErrorCollection类型,ModelErrorCollection是一个ModelError的集合,而ModelError的ErrorMessage属性包含了验证失败错误信息。
大致是这样:
○ ModelStateDictionary实际上是IDictionary<string, ModelState>类型
○ ModelState.Errors属性实际上是ModelErrorCollection类型
○ ModelErrorCollection实际上是ICollection<ModelError>类型
○ ModelError.ErrorMessage属性存储着所有验证失败信息
接下来的工作,其实就是如何把这个验证信息找出来。我们先手工添加一条验证信息,然后试图显示它:
ModelState.AddModelError("UserName", "请输入用户名。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')");
上面的代码中,Values集合表示的为不同的键值,而Errors则表示同一键值下的不同信息。
ModelState.AddModelError("UserName", "请输入用户名。"); ModelState.AddModelError("UserName", "用户名不正确。"); ModelState.AddModelError("PassWord", "请输入密码。"); ModelState.AddModelError("PassWord", "密码不正确。"); //输出第一条 return Content(ModelState.Values.First().Errors[0].ErrorMessage); //输出第二条 return Content(ModelState.Values.First().Errors[1].ErrorMessage); //输出第三条 return Content(ModelState.Values.Skip(1).First().Errors[0].ErrorMessage); //输出第四条 return Content(ModelState.Values.Skip(1).First().Errors[1].ErrorMessage);
清楚了这些,遍历一个ModelState也就不难了。
StringBuilder errinfo = new StringBuilder(); foreach (var s in ModelState.Values) { foreach (var p in s.Errors) { errinfo.AppendFormat("{0}\\n", p.ErrorMessage); } } return JavaScript("alert('" + errinfo.ToString() + "')");
以下分别是集中显示错误信息和依次显示错误信息的代码:
集中显示错误信息:
[HttpPost] public ActionResult Index(LogOnModel model) { if (string.IsNullOrEmpty(model.UserName)) { ModelState.AddModelError("UserName", "请输入用户名。"); } if (string.IsNullOrEmpty(model.PassWord)) { ModelState.AddModelError("PassWord", "请输入密码。"); } if (string.IsNullOrEmpty(model.CheckCode)) { ModelState.AddModelError("ChkCode", "请输入验证码。"); } if (!ModelState.IsValid) { StringBuilder errinfo = new StringBuilder(); foreach (var s in ModelState.Values) { foreach (var p in s.Errors) { errinfo.AppendFormat("{0}\\n", p.ErrorMessage); } } return JavaScript("alert('" + errinfo.ToString() + "')"); } return View(); }
依次逐条显示错误信息:
[HttpPost] public ActionResult Index(LogOnModel model) { if (string.IsNullOrEmpty(model.UserName)) { ModelState.AddModelError("UserName", "请输入用户名。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')"); } if (string.IsNullOrEmpty(model.PassWord)) { ModelState.AddModelError("UserName", "请输入密码。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')"); } if (string.IsNullOrEmpty(model.CheckCode)) { ModelState.AddModelError("UserName", "请输入验证码。"); return JavaScript("alert('" + ModelState.Values.First().Errors[0].ErrorMessage + "')"); } if (ModelState.IsValid) { } return View(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2015-12-14 CSS3/SVG clip-path路径剪裁遮罩属性简介
2015-12-14 CSS和SVG中的剪切——clip-path属性和<clipPath>元素
2015-12-14 理解SVG坐标系统和变换: 建立新视窗
2015-12-14 理解SVG坐标系统和变换: transform属性
2015-12-14 理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio
2015-12-14 Art-Directing SVG图像viewBox属性