var query = from state in ModelState.Values
from error in state.Errors
select error.ErrorMessage;
var errors = query.ToArray(); // ToList() and so on...
12
这正在扩展@Dunc的答案 . 请参阅xml doc comments
// ReSharper disable CheckNamespace
using System.Linq;
using System.Web.Mvc;
public static class Debugg
{
/// <summary>
/// This class is for debugging ModelState errors either in the quick watch
/// window or the immediate window.
/// When the model state contains dozens and dozens of properties,
/// it is impossible to inspect why a model state is invalid.
/// This method will pull up the errors
/// </summary>
/// <param name="modelState">modelState</param>
/// <returns></returns>
public static ModelError[] It(ModelStateDictionary modelState)
{
var errors = modelState.Values.SelectMany(x => x.Errors).ToArray();
return errors;
}
}
0
foreach (ModelState modelState in ViewData.ModelState.Values) {
foreach (ModelError error in modelState.Errors) {
DoSomethingWith(error);
}
}
var modelQuery = (from kvp in ModelState
let field = kvp.Key
let state = kvp.Value
where state.Errors.Count > 0
let val = state.Value.AttemptedValue ?? "[NULL]"
let errors = string.Join(";", state.Errors.Select(err => err.ErrorMessage))
select string.Format("{0}:[{1}] (ERRORS: {2})", field, val, errors));
Trace.WriteLine(string.Join(Environment.NewLine, modelQuery));
In your implementation you are missing static Class, this should be.
if (!ModelState.IsValid)
{
var errors = ModelStateErrorHandler.GetModelErrors(this.ModelState);
return Json(new { errors });
}
宁
if (!ModelState.IsValid)
{
var errors = ModelState.GetModelErrors();
return Json(new { errors });
}
4
我能用一点LINQ做到这一点,
public static List<string> GetErrorListFromModelState
(ModelStateDictionary modelState)
{
var query = from state in modelState.Values
from error in state.Errors
select error.ErrorMessage;
var errorList = query.ToList();
return errorList;
}
if (!ModelState.IsValid)
{
var errors = ModelState.GetModelErrors();
return Json(new { errors });
}
Usings:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using WebGrease.Css.Extensions;
Class:
public static class ModelStateErrorHandler
{
/// <summary>
/// Returns a Key/Value pair with all the errors in the model
/// according to the data annotation properties.
/// </summary>
/// <param name="errDictionary"></param>
/// <returns>
/// Key: Name of the property
/// Value: The error message returned from data annotation
/// </returns>
public static Dictionary<string, string> GetModelErrors(this ModelStateDictionary errDictionary)
{
var errors = new Dictionary<string, string>();
errDictionary.Where(k => k.Value.Errors.Count > 0).ForEach(i =>
{
var er = string.Join(", ", i.Value.Errors.Select(e => e.ErrorMessage).ToArray());
errors.Add(i.Key, er);
});
return errors;
}
public static string StringifyModelErrors(this ModelStateDictionary errDictionary)
{
var errorsBuilder = new StringBuilder();
var errors = errDictionary.GetModelErrors();
errors.ForEach(key => errorsBuilder.AppendFormat("{0}: {1} -", key.Key,key.Value));
return errorsBuilder.ToString();
}
}
14 回答
这也有效:
这正在扩展@Dunc的答案 . 请参阅xml doc comments
另见How do I get the collection of Model State Errors in ASP.NET MVC? .
仅输出错误消息本身对我来说还不够,但这样做了 .
用于将错误消息数组传递给View,可能是通过Json:
使用LINQ:
在LINQ版本的基础上,如果要将所有错误消息加入到一个字符串中:
In your implementation you are missing static Class, this should be.
宁
我能用一点LINQ做到这一点,
上述方法返回验证错误列表 .
Further Reading :
How to read all errors from ModelState in ASP.NET MVC
在调试过程中,我发现在每个页面的底部放置一个表来显示所有ModelState错误很有用 .
此外,
ModelState.Values.ErrorMessage
可能为空,但ModelState.Values.Exception.Message
可能表示错误 .如果有人想要返回Model属性的名称,以便在强类型视图中绑定错误消息 .
这样,您实际上可以将错误与引发错误的字段联系起来 .
正如我发现在目前为止给出的答案中遵循了建议,您可以在没有设置错误消息的情况下发生异常,因此要捕获所有问题,您需要同时获取ErrorMessage和Exception .
或作为一种延伸方法
为了以防有人需要它,我在我的项目中使用了以下静态类
Usage example:
Usings:
Class: