ASP.NET MVC遍历ModelState的错误信息

在ASP.NET MVC中,ModelState中包含了验证失败的错误信息,具体被存储在ModelState.Values[i].Errors[j].ErrorMessage属性中。当然,通过打断点,单步调试可以查看具体的验证失败错误信息,但有时候希望把ModelState中的验证失败信息遍历显示出来。

ModelState类型是ModelStateDictionary,ModelStateDictionary是一个字典集合,键是模型的各个属性,值是模型各个属性对应的ModelState。

ModelState的Errors属性存储了所有验证失败信息,是一个ModelErrorCollection类型,ModelErrorCollection是一个ModelError的集合,而ModelError的ErrorMessage属性包含了验证失败错误信息。

大致是这样:

○ ModelStateDictionary实际上是IDictionary<string, ModelState>类型
○ ModelState.Errors属性实际上是ModelErrorCollection类型
○ ModelErrorCollection实际上是ICollection<ModelError>类型
○ 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<ShowError>集合。

   public static class ModelStateExtensions
    {
        public static IEnumerable<ShowError> AllModelStateErrors(this ModelStateDictionary modelState)
        {
            var result = new List<ShowError>();

            //找到出错的字段以及出错信息
            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";
}

<h2>Index</h2>
@using (Html.BeginForm("GetErrors", "Home", FormMethod.Post, new {id = "addForm"}))
{
    @Html.TextBoxFor(m => m.Name)

    <br />
    @Html.TextBoxFor(m => m.Age)
    <br />
    @Html.TextBoxFor(m => m.Score)
    <br />
    <input type="button" id="up" value="提交" />
}

@section scripts
{
    <script type="text/javascript">
        $(function () {
            $(‘#up‘).on(‘click‘, function () {
                $.post(‘@Url.Action("GetErrors")‘, $(‘#addForm‘).serialize()).fail(function(error) {
                    var response = JSON.parse(error.responseText);
                    for (var i = 0; i < response.length; i++) {
                        var e = response[i];
                        var fieldKey = e.Key;
                        var message = e.Message;
                        console.log(fieldKey + ‘: ‘ + message);
                    }
                });

            });
        });
    </script>
}

最终,在控制台显示验证失败信息如下:

时间: 2024-10-14 13:16:53

ASP.NET MVC遍历ModelState的错误信息的相关文章

MVC验证06-自定义错误信息

原文:MVC验证06-自定义错误信息 本文体验自定义错误信息.   系统默认的错误信息 在"MVC验证02-自定义验证规则.邮件验证"中,我们自定义了一个验证Email的类.如果输入邮件格式错误,出现系统默认的报错信息. 效果:                   通过ErrorMessage来修改错误信息 [Email(ErrorMessage = "Email格式错误")] [Display(Name = "邮件")] public stri

ASP.NET MVC里ModelState.IsValid总是true或者总是false

model的属性如果不加验证相关的特性,ModelState.IsValid会永远为true:如果加了验证相关的特性,不满足验证规则时,ModelState.IsValid为false. 接收到参数属性类型与Model定义不符时,ModelState.IsValid也会为false. 参数模型: public class PersonModel { public string FirstName { get; set; } public string LastName { get; set; }

ASP.NET MVC中Log4Net记录错误日志的使用

第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSections>节点中 配置log4Net节点引用. <!--log4net日志记录--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net

asp.net mvc 碰到 XML 解析错误:找不到根元素 位置

具体报错信息如下: XML 解析错误:找不到根元素 位置:moz-nullprincipal:{4a1d2b7c-6d07-468e-9df9-2267a0422c93} 行 1,列 1: 网上给出的解决方案: js跨域操作时(网上搜,比较详细) 看着貌似有点沾边,结果我把浏览器缓存清除之后,就没有再出现这个问题了

Asp.Net mvc筛选器中返回信息中断操作

在mvc中,使用response.end()或Response.Redirect("url"); 是无法阻止请求继续往下执行的.如果在action中,可以我们可以使用return 进行中断. 如果在筛选器中如何中断呢?其实我们只用重新复制上下文的result对象,就可以可. sonResult result=new JsonResult(); result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; result.Data =

asp.net mvc 遍历linq to sql 多表联查

两张表: 班级表和学生表: 最终想获得学生的姓名.密码.性别.年龄.住址.爱好.班级名称.班级所学方向 var temp=from a in _db.student join b in _db.classes on a.c_id equals b.id select new { Id=a.id, Name = a.name, Pwd = a.pwd, Sex = a.sex, Age = a.age, Address = a.address, Hobby = a.hobby, StuName =

第16章 ASP.NET MVC 日志篇

本章主要介绍MVC中内置的错误处理.日志以及用来提升性能的监控工具 一.错误处理     当该网站忙于处理HTTP请求时,很多内容都会出错.幸运的是,MVC让错误处理工作变得相对简单了很多,因为MVC应用是运行在MVC框架之上的,所以可以访问底层框架的核心功能,包括自定义错误处理页面及显示错误状态码. 其中处理错误有三种基本的方法: (1)第一种:配置<customErrors/>节点 也是最简单的一种,即启用MVC自定义错误处理特性:就是在web.config文件中配置<customE

遍历ModelState中存储的错误信息

在服务器端验证中,有时我们添加了一个ModelError,然后还需要将该信息以JS的形式返回到客户端.如: [HttpPost] public ActionResult Index(LogOnModel model) { if (string.IsNullOrEmpty(model.UserName)) { ModelState.AddModelError("UserName", "请输入用户名."); return JavaScript("alert('

ASP.NET MVC AJAX调用JsonResult方法并返回自定义错误信息

一.如何用AJAX调用JsonResult方法 比如FuckController中添加有个返回JsonResult类型的方法FuckJson(): public JsonResult FuckJson() { return new JsonResult() { Data = new List<string>() { "fuck", "shit" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }