首页 文章

如何从ASP.Net MVC modelState获取所有错误?

提问于
浏览
368

我想在不知道键值的情况下从modelState中获取所有错误消息 . 循环以获取ModelState包含的所有错误消息 .

我怎样才能做到这一点?

14 回答

  • 450

    这也有效:

    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);
        }
    }
    

    另见How do I get the collection of Model State Errors in ASP.NET MVC? .

  • 4

    仅输出错误消息本身对我来说还不够,但这样做了 .

    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));
    
  • 4

    用于将错误消息数组传递给View,可能是通过Json:

    messageArray = this.ViewData.ModelState.Values.SelectMany(modelState => modelState.Errors, (modelState, error) => error.ErrorMessage).ToArray();
    
  • 159

    使用LINQ

    IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
    
  • 25

    在LINQ版本的基础上,如果要将所有错误消息加入到一个字符串中:

    string messages = string.Join("; ", ModelState.Values
                                            .SelectMany(x => x.Errors)
                                            .Select(x => x.ErrorMessage));
    
  • 5

    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;
    }
    

    上述方法返回验证错误列表 .

    Further Reading :

    How to read all errors from ModelState in ASP.NET MVC

  • 2

    在调试过程中,我发现在每个页面的底部放置一个表来显示所有ModelState错误很有用 .

    <table class="model-state">
        @foreach (var item in ViewContext.ViewData.ModelState) 
        {
            if (item.Value.Errors.Any())
            { 
            <tr>
                <td><b>@item.Key</b></td>
                <td>@((item.Value == null || item.Value.Value == null) ? "<null>" : item.Value.Value.RawValue)</td>
                <td>@(string.Join("; ", item.Value.Errors.Select(x => x.ErrorMessage)))</td>
            </tr>
            }
        }
    </table>
    
    <style>
        table.model-state
        {
            border-color: #600;
            border-width: 0 0 1px 1px;
            border-style: solid;
            border-collapse: collapse;
            font-size: .8em;
            font-family: arial;
        }
    
        table.model-state td
        {
            border-color: #600;
            border-width: 1px 1px 0 0;
            border-style: solid;
            margin: 0;
            padding: .25em .75em;
            background-color: #FFC;
        }
     </style>
    
  • 437

    此外, ModelState.Values.ErrorMessage 可能为空,但 ModelState.Values.Exception.Message 可能表示错误 .

  • 11

    如果有人想要返回Model属性的名称,以便在强类型视图中绑定错误消息 .

    List<ErrorResult> Errors = new List<ErrorResult>();
    foreach (KeyValuePair<string, ModelState> modelStateDD in ViewData.ModelState)
    {
        string key = modelStateDD.Key;
        ModelState modelState = modelStateDD.Value;
    
        foreach (ModelError error in modelState.Errors)
        {
            ErrorResult er = new ErrorResult();
            er.ErrorMessage = error.ErrorMessage;
            er.Field = key;
            Errors.Add(er);
        }
    }
    

    这样,您实际上可以将错误与引发错误的字段联系起来 .

  • 2

    正如我发现在目前为止给出的答案中遵循了建议,您可以在没有设置错误消息的情况下发生异常,因此要捕获所有问题,您需要同时获取ErrorMessage和Exception .

    String messages = String.Join(Environment.NewLine, ModelState.Values.SelectMany(v => v.Errors)
                                                               .Select( v => v.ErrorMessage + " " + v.Exception));
    

    或作为一种延伸方法

    public static IEnumerable<String> GetErrors(this ModelStateDictionary modelState)
    {
          return modelState.Values.SelectMany(v => v.Errors)
                                  .Select( v => v.ErrorMessage + " " + v.Exception).ToList();
    
    }
    
  • 4

    为了以防有人需要它,我在我的项目中使用了以下静态类

    Usage example:

    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();
        }
    }
    

相关问题