¿Cómo se obtiene una lista de todos los mensajes de error de ModelState? Encontré este código para obtener todas las claves: ( Devolver una lista de claves con errores de ModelState )
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Pero, ¿cómo obtendría los mensajes de error como IList o IQueryable?
Podría ir:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Pero eso es hacerlo manualmente, ¿seguramente hay una manera de hacerlo usando LINQ? La propiedad .ErrorMessage está tan abajo en la cadena que no sé cómo escribir el LINQ ...
.Where(kvp => kvp.Value.Errors.Count > 0)
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
que debería usar, de lovar errorList = modelState.Where(elem => elem.Value.Errors.Any()) .ToDictionary( kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => string.IsNullOrEmpty(e.ErrorMessage) ? e.Exception.Message : e.ErrorMessage).ToArray());
contrario no tendrá losAquí está la implementación completa con todas las piezas juntas:
Primero cree un método de extensión:
Luego llame a ese método de extensión y devuelva los errores de la acción del controlador (si corresponde) como json:
Y finalmente, muestre esos errores en el lado del cliente (en el estilo de jquery.validation, pero se puede cambiar fácilmente a cualquier otro estilo)
fuente
.Where(m => m.Value.Count() > 0)
también podría escribirse como.Where(m => m.Value.Any())
.Me gusta usar
Hashtable
aquí, para obtener el objeto JSON con propiedades como claves y errores como valor en forma de matriz de cadenas.De esta manera obtienes la siguiente respuesta:
fuente
Hay muchas maneras diferentes de hacer esto que funcionan. Aquí está ahora lo hago ...
fuente
BadRequest(ModelState)
y lo serializará en JSON por usted.La forma más fácil de hacer esto es devolver un a
BadRequest
con el ModelState en sí:Por ejemplo en un
PUT
:Si usamos anotaciones de datos en, por ejemplo, un número de móvil, como este, en la
Update
clase:Esto devolverá lo siguiente en una solicitud no válida:
fuente
@JK me ayudó mucho, pero ¿por qué no?
fuente
Eche un vistazo a System.Web.Http.Results.OkNegotiatedContentResult.
Convierte todo lo que arrojes en JSON.
Entonces hice esto
Esto resultó en:
Todavía tengo que comprobar qué sucede cuando hay más de un error para cada campo, pero el punto es que OkNegoriatedContentResult es brillante.
Tengo la idea de linq / lambda de @SLaks
fuente
Manera simple de lograr esto mediante el uso de la funcionalidad incorporada
El resultado de JSON será
fuente
ToDictionary es una extensión Enumerable que se encuentra en System.Linq empaquetada en System.Web.Extensions dll http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx . Así es como se ve la clase completa para mí.
fuente
¿Por qué no devolver el
ModelState
objeto original al cliente y luego usar jQuery para leer los valores? Para mí, parece mucho más simple y utiliza la estructura de datos común (.net'sModelState
)para devolver el
ModelState
como Json, simplemente páselo al constructor de la clase Json (funciona con CUALQUIER objeto)C#:
js:
fuente
Variación con tipo de retorno en lugar de devolver IEnumerable
fuente
Hice una extensión que devuelve una cadena con el separador "" (puede usar el suyo):
fuente
si usa jsonresult, entonces regrese
o simplemente puede devolver el modelStateErrors, no lo he probado. Lo que hice fue asignar la colección de Errores a mi ViewModel y luego hacer un bucle ... En este caso, puedo devolver mis Errores a través de json. Tengo una clase / modelo, quería obtener la fuente / clave pero todavía estoy tratando de resolverlo.
fuente