• 遍历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();
            }
    复制代码
  • 相关阅读:
    HashMap put原理详解(基于jdk1.8)
    适合 C++ 新手学习的开源项目——在 GitHub 学编程
    连续肝了好几天,终于把Java面试必备最重要的基础知识【Java集合】知识点总结整理出来了。
    「精选」史上最全Java工程师面试题汇总,没有之一,不接受反驳!
    想拿到10k-40k的offer,这些技能必不可少!作为程序员的你了解吗?
    QuickBI助你成为分析师-数据建模(一)
    Java Web整合开发(36) -- Web Service框架XFire
    查找
    CentOS7下RabbitMQ服务安装配置
    php rabbitmq操作类及生产者和消费者实例代码 转
  • 原文地址:https://www.cnblogs.com/Alex80/p/6178696.html
Copyright © 2020-2023  润新知