[LINQ]ASP.NET MVC应用程序开发中将ModelState错误转换成JSON的方式有哪些呢?

.NET 作者: Rector 583阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

在ASP.NET MVC的应用程序开发中,我们将控制器中操作(Action)的所有错误以集合的方式均放到了ModelState中,我们可以如下的方式获取ModelState中所有错误的键,如:

var errorKeys = (from item in ModelState
        where item.Value.Errors.Any() 
        select item.Key).ToList();

但是,我们如何获取所有错误的IList或者IQueryable集合呢?
我们可以通过循环来获取,如下:

foreach (var key in errorKeys)
{
    string msg = ModelState[error].Errors[0].ErrorMessage;
    errorList.Add(msg);
}

在.NET/C#的应用程序开中,有没有更快速的方式来获取所有错误的集合呢,比如通过LINQ

方案一

可以通过LINQselect语法来获取所有ModelState中的错误,并返回错误集合,如下:

var errorList = (from item in ModelState
        where item.Value.Errors.Any() 
        select item.Value.Errors[0].ErrorMessage).ToList();

我们还可以通过添加一个from关键字来实现,如下:

var errorList = (from item in ModelState.Values
        from error in item.Errors
        select error.ErrorMessage).ToList();

或者使用SelectMany()Select()lambda 表达式来实现,如下:

var errorList = ModelState.Values.SelectMany(m => m.Errors)
                                 .Select(e => e.ErrorMessage)
                                 .ToList();

最后,我们还可以将所有错误信息转换成一个字典,如下:

var errorList = ModelState.ToDictionary(
    kvp => kvp.Key,
    kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
);

方案二

创建一个静态扩展方法来处理,如下:

public static class ModelStateHelper
{
    public static IEnumerable Errors(this ModelStateDictionary modelState)
    {
        if (!modelState.IsValid)
        {
            return modelState.ToDictionary(kvp => kvp.Key,
                kvp => kvp.Value.Errors
                                .Select(e => e.ErrorMessage).ToArray())
                                .Where(m => m.Value.Count() > 0);
        }
        return null;
    }
}

调用方法:

if (!ModelState.IsValid)
{
    return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}

方案三

使用HashTable来处理,如下:

var errors = new Hashtable();
foreach (var pair in ModelState)
{
    if (pair.Value.Errors.Count > 0)
    {
        errors[pair.Key] = pair.Value.Errors.Select(error => error.ErrorMessage).ToList();
    }
}
return Json(new { success = false, errors });

将会返回类似如下的JSON数据结果:

{
   "success":false,
   "errors":{
      "Phone":[
         "The Phone field is required."
      ]
   }
}

方案四

if (ModelState.IsValid)
{
    return Json("Success");
}
else
{
    return Json(ModelState.Values.SelectMany(x => x.Errors));
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » [LINQ]ASP.NET MVC应用程序开发中将ModelState错误转换成JSON的方式有哪些呢?

发布于: 2018-03-13 07:20:47
分享扩散: