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

 更新时间:2022年09月26日 08:36:55   作者:Darren Ji  
这篇文章介绍了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>
}

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

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

相关文章

  • IIS7中ASP.net 请求处理过程说明

    IIS7中ASP.net 请求处理过程说明

    IIS7 站点启动并处理请求的步骤如下,在iis7中处理asp.net的朋友可以参考下。
    2011-02-02
  • 详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    这篇文章主要介绍了详解ASP.NET Core 2.0 路由引擎之网址生成(译),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • .net core webapi通过中间件获取请求和响应内容的方法

    .net core webapi通过中间件获取请求和响应内容的方法

    这篇文章主要介绍了.net core webapi通过中间件获取请求和响应内容的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 合并两个DataSet的数据内容的方法

    合并两个DataSet的数据内容的方法

    合并两个DataSet的数据内容的方法,需要的朋友可以参考一下
    2013-03-03
  • .Net弹性和瞬态故障处理库Polly实现执行策略

    .Net弹性和瞬态故障处理库Polly实现执行策略

    这篇文章介绍了.Net弹性和瞬态故障处理库Polly实现执行策略的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • asp.net HttpWebRequest自动识别网页编码

    asp.net HttpWebRequest自动识别网页编码

    HttpWebRequest获取网页源代码时自动识别网页编码,通过读取页面中的charset和读取http头中的编码信息获取页面的编码,基本可以正确获取网页编码
    2008-09-09
  • 用ASP.NET做的个性化的邮件发送系统

    用ASP.NET做的个性化的邮件发送系统

    如果要你用ASP来做一个邮件发送系统,你一定认为这是一个比较复杂的工作。其实也的确是这样。但当他的后继产品ASP.NET被推出以后,他的强大功能就使的这一切就变的相对简单了。真的这样神奇么?我们就通过ASP.NET做一个邮件发送系统,看看到底有什么奥秘,是不是真的简单。
    2008-02-02
  • 详解ASP.NET Core3.0 配置的Options模式

    详解ASP.NET Core3.0 配置的Options模式

    这篇文章主要介绍了详解ASP.NET Core3.0 配置的Options模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 基于nopCommerce的开发框架 附源码

    基于nopCommerce的开发框架 附源码

    这篇文章主要为大家详细介绍了基于nopCommerce的开发框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • ASP.NET站点导航应用详解

    ASP.NET站点导航应用详解

    这篇文章主要内容是ASP.NET站点导航,主要包括站点导航以及动态修改内存中的站点地图,感兴趣的小伙伴们可以参考一下
    2015-09-09

最新评论