[asp.net-mvc] ¿Cómo obtener todos los errores de ASP.Net MVC modelState?



6 Answers

Usando LINQ :

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

Quiero obtener todos los mensajes de error del modeloState sin conocer los valores clave. Looping para captar todos los mensajes de error que contiene el ModelState.

¿Cómo puedo hacer esto?




Pude hacer esto usando un pequeño 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;
}

El método anterior devuelve una lista de errores de validación.

Otras lecturas :

Cómo leer todos los errores de ModelState en ASP.NET MVC




Útil para pasar una matriz de mensajes de error a Ver, quizás a través de Json:

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



En su implementación le falta Clase estática, esto debería ser.

if (!ModelState.IsValid)
{
    var errors =  ModelStateErrorHandler.GetModelErrors(this.ModelState);
    return Json(new { errors });
}

más bien

if (!ModelState.IsValid)
{
    var errors = ModelState.GetModelErrors();
    return Json(new { errors });
}



Como descubrí haber seguido el consejo en las respuestas dadas hasta ahora, puede obtener excepciones sin mensajes de error, por lo tanto, para detectar todos los problemas, realmente necesita obtener el ErrorMessage y la excepción.

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

o como un método de extensión

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

}



Esto se expande con la respuesta de @Dunc. Ver los comentarios de xml doc

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



La salida solo de los mensajes de error no fue suficiente para mí, pero fue el truco.

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



Related