遍历ModelState中存储的错误信息

Posted 大西瓜3721

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遍历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();
        }
复制代码

以上是关于遍历ModelState中存储的错误信息的主要内容,如果未能解决你的问题,请参考以下文章

基于modelState的信息验证

尝试保存实体时 ModelState.isvalid 为 false,错误表示相关实体中需要字段

ASP.NET MVC 如何将 ModelState 错误转换为 json

如何在 MVC Web API 发布方法中将 ModelState 错误返回到 Kendo 网格?

Asp.Net Core Razor 页面中的“ModelState.AddModelError”显示不正确的错误消息

ModelState 错误不会以部分视图形式显示