问题描述
在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
?
方案一
可以通过LINQ
的select
语法来获取所有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));
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册