搜索

查看: 3089|回复: 11

[ASP.NET] ASP.NET MVC遍历验证ModelState的错误信息

[复制链接]
发表于 2023-5-4 11:31:14 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:31:14 3089 11 看全部
在ASP.NET MVC中,ModelState中包含了验证失败的错误信息,具体被存储在ModelState.Values.Errors[j].ErrorMessage属性中。当然,通过打断点,单步调试可以查看具体的验证失败错误信息,但有时候希望把ModelState中的验证失败信息遍历显示出来。
ModelState类型是ModelStateDictionary,ModelStateDictionary是一个字典集合,键是模型的各个属性,值是模型各个属性对应的ModelState。
ModelState的Errors属性存储了所有验证失败信息,是一个ModelErrorCollection类型,ModelErrorCollection是一个ModelError的集合,而ModelError的ErrorMessage属性包含了验证失败错误信息。
大致是这样:
  • ModelStateDictionary实际上是IDictionary类型
  • ModelState.Errors属性实际上是ModelErrorCollection类型
  • ModelErrorCollection实际上是ICollection类型
  • ModelError.ErrorMessage属性存储着所有验证失败信息
    如何把验证失败信息显示出来呢?
    {"属性1","属性1验证失败错误信息1"},
    {"属性1","属性1验证失败错误信息2"},
    {"属性2","属性2验证失败错误信息1"}
    ......
    想写成如上的样子,通过json读取出来,在后台遍历,都可以。
    那就先抽象出一个显示错误信息的模型。
        public class ShowError
        {
            public ShowError(string key, string message)
            {
                Key = key;
                Message = message;
            }
            public string Key { get; set; }
            public string Message { get; set; }
        }
    由于ModelState是ModelStateDictionary类型,那就针对ModelStateDictionary类型写一个扩展方法。就是把ModelStateDictionary中的验证失败信息连同对应的属性读取出来,注入到ShowError这个模型中,并最终得到一个IEnumerable集合。
       public static class ModelStateExtensions
        {
            public static IEnumerable AllModelStateErrors(this ModelStateDictionary modelState)
            {
                var result = new List();
                //找到出错的字段以及出错信息
                var errorFieldsAndMsgs = modelState.Where(m => m.Value.Errors.Any())
                    .Select(x => new {x.Key, x.Value.Errors});
                foreach (var item in errorFieldsAndMsgs)
                {
                    //获取键
                    var fieldKey = item.Key;
                    //获取键对应的错误信息
                    var fieldErrors = item.Errors
                        .Select(e => new ShowError(fieldKey, e.ErrorMessage));
                    result.AddRange(fieldErrors);
                }
                return result;
            }
        }
    再来一个最终用来测试验证失败错误信息的视图模型。
       public class Student
        {
            public int Id { get; set; }
            [Required(ErrorMessage = "必填")]
            [StringLength(5, ErrorMessage = "长度1-5位")]
            public string Name { get; set; }
            [Required(ErrorMessage = "必填")]
            public int Age { get; set; }
            [Required(ErrorMessage = "必填")]
            [Range(typeof(Decimal), "0", "100", ErrorMessage = "{0} 必须是数字介于 {1} 和 {2}之间.")]
            public decimal Score { get; set; }
        }
    在HomeController中,有一个Action用来呈现Student的强类型视图页,有一个Action用来把从ModelState中获取到的所有属性以及对应的验证失败信息以json格式返回给前台视图。
       public class HomeController : Controller
        {
            public ActionResult Index()
            {
                return View(new Student());
            }
            [HttpPost]
            public ActionResult GetErrors(Student student)
            {
                if (ModelState.IsValid)
                {
                    return Content("没有错误信息~~");
                }
                Response.StatusCode = 400;
                Response.TrySkipIisCustomErrors = true;
                var modelErrors = ModelState.AllModelStateErrors();
                return Json(modelErrors);
            }
        }
    在Home/Index.cshtml视图中,当点击"提交"按钮,在控制台显示验证失败信息。
    @model MvcApplication1.Models.Student
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    Index
    @using (Html.BeginForm("GetErrors", "Home", FormMethod.Post, new {id = "addForm"}))
    {
        @Html.TextBoxFor(m => m.Name)
       
        @Html.TextBoxFor(m => m.Age)
       
        @Html.TextBoxFor(m => m.Score)
       
       
    }
    @section scripts
    {
       
    }
    最终,在控制台显示验证失败信息如下:

    202292683640383.png

    202292683640383.png


    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对知鸟论坛的支持。如果你想了解更多相关内容请查看下面相关链接
  • 回复

    使用道具 举报

    发表于 2023-6-28 18:29:18 | 显示全部楼层
    贺老师 2023-6-28 18:29:18 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-29 01:31:27 | 显示全部楼层
    惜颜705 2023-6-29 01:31:27 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 14:12:59 | 显示全部楼层
    向往草原403 2023-6-29 14:12:59 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 17:23:57 | 显示全部楼层
    老橡树1 2023-6-29 17:23:57 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-30 00:40:44 | 显示全部楼层
    素色流年783 2023-6-30 00:40:44 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 22:00:22 | 显示全部楼层
    十二音阶囤 2023-7-3 22:00:22 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-3 22:29:58 | 显示全部楼层
    我是的十八簿 2023-7-3 22:29:58 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-7-3 23:23:27 | 显示全部楼层
    幸福341 2023-7-3 23:23:27 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-7-6 15:23:46 | 显示全部楼层
    123456868 2023-7-6 15:23:46 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表