首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >json MVC如何将ModelState错误转换为ASP.NET

json MVC如何将ModelState错误转换为ASP.NET
EN

Stack Overflow用户
提问于 2010-05-17 07:09:01
回答 12查看 82.7K关注 0票数 132

如何获取所有ModelState错误消息的列表?我找到了这段代码来获取所有的密钥:( Returning a list of keys with ModelState errors)

代码语言:javascript
复制
var errorKeys = (from item in ModelState
        where item.Value.Errors.Any() 
        select item.Key).ToList();

但是,作为IList或IQueryable,我如何获取错误消息?

我可以去:

代码语言:javascript
复制
foreach (var key in errorKeys)
{
    string msg = ModelState[error].Errors[0].ErrorMessage;
    errorList.Add(msg);
}

但这是手动完成的--当然有一种方法可以使用LINQ来完成?.ErrorMessage属性太复杂了,以至于我不知道如何编写LINQ...

EN

回答 12

Stack Overflow用户

发布于 2010-05-17 11:25:07

下面是将所有部分放在一起的完整实现:

首先创建一个扩展方法:

代码语言:javascript
复制
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.Any());
        }
        return null;
    }
}

然后调用该扩展方法,并将控制器操作中的错误(如果有)作为json返回:

代码语言:javascript
复制
if (!ModelState.IsValid)
{
    return Json(new { Errors = ModelState.Errors() }, JsonRequestBehavior.AllowGet);
}

最后,在客户端显示这些错误(以jquery.validation样式,但可以很容易地更改为任何其他样式)

代码语言:javascript
复制
function DisplayErrors(errors) {
    for (var i = 0; i < errors.length; i++) {
        $("<label for='" + errors[i].Key + "' class='error'></label>")
        .html(errors[i].Value[0]).appendTo($("input#" + errors[i].Key).parent());
    }
}
票数 77
EN

Stack Overflow用户

发布于 2013-09-05 05:09:27

我喜欢在这里使用Hashtable,这样我就可以以字符串数组的形式获得属性作为键,错误作为值的JSON对象。

代码语言:javascript
复制
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 });

这样,您将获得以下响应:

代码语言:javascript
复制
{
   "success":false,
   "errors":{
      "Phone":[
         "The Phone field is required."
      ]
   }
}
票数 23
EN

Stack Overflow用户

发布于 2013-11-29 20:11:25

有很多不同的方法可以做到这一点,所有的工作。这就是我现在做的..。

代码语言:javascript
复制
if (ModelState.IsValid)
{
    return Json("Success");
}
else
{
    return Json(ModelState.Values.SelectMany(x => x.Errors));
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2845852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档