net mvc form example editar asp html asp.net-mvc validation spark-view-engine

html - form - editar en mvc asp net



¿Cómo obtengo la colección de errores de estado del modelo en ASP.NET MVC? (8)

Al reunir varias respuestas de arriba, esto es lo que terminé usando:

var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0) .SelectMany(E => E.Errors) .Select(E => E.ErrorMessage) .ToList();

validationErrors termina siendo una List<string> que contiene cada mensaje de error. A partir de ahí, es fácil hacer lo que quiera con esa lista.

¿Cómo obtengo la colección de errores en una vista?

No deseo utilizar el Resumen de Validación de Html Helper ni el Mensaje de Validación. En cambio, quiero verificar si hay errores y si hay alguno, mostrarlos en un formato específico. También en los controles de entrada quiero verificar un error de propiedad específico y agregar una clase a la entrada.

PD. Estoy usando Spark View Engine, pero la idea debería ser la misma.

Así que pensé que podría hacer algo como ...

<if condition="${ModelState.Errors.Count > 0}"> DispalyErrorSummary() </if> ....and also... <input type="text" value="${Model.Name}" class="?{ModelState.Errors["Name"] != string.empty} error" /> ....

O algo así.

ACTUALIZAR

Mi solución final se veía así:

<input type="text" value="${ViewData.Model.Name}" class="text error?{!ViewData.ModelState.IsValid && ViewData.ModelState["Name"].Errors.Count() > 0}" id="Name" name="Name" />

Esto solo agrega el error css class si esta propiedad tiene un error.


Aquí está el VB.

Dim validationErrors As String = String.Join(",", ModelState.Values.Where(Function(E) E.Errors.Count > 0).SelectMany(Function(E) E.Errors).[Select](Function(E) E.ErrorMessage).ToArray())


Esto te dará una cadena con todos los errores con separación de coma

string validationErrors = string.Join(",", ModelState.Values.Where(E => E.Errors.Count > 0) .SelectMany(E => E.Errors) .Select(E => E.ErrorMessage) .ToArray());


Gracias Chad! Para mostrar todos los errores asociados con la clave, esto es lo que se me ocurrió. Por algún motivo, el helper base Html.ValidationMessage solo muestra el primer error asociado a la clave.

<%= Html.ShowAllErrors(mykey) %>

HtmlHelper:

public static String ShowAllErrors(this HtmlHelper helper, String key) { StringBuilder sb = new StringBuilder(); if (helper.ViewData.ModelState[key] != null) { foreach (var e in helper.ViewData.ModelState[key].Errors) { TagBuilder div = new TagBuilder("div"); div.MergeAttribute("class", "field-validation-error"); div.SetInnerText(e.ErrorMessage); sb.Append(div.ToString()); } } return sb.ToString(); }


Para obtener los errores de ModelState, use este Linq:

var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);


Si no sabe qué propiedad causó el error, puede, mediante la reflexión, recorrer todas las propiedades:

public static String ShowAllErrors<T>(this HtmlHelper helper) { StringBuilder sb = new StringBuilder(); Type myType = typeof(T); PropertyInfo[] propInfo = myType.GetProperties(); foreach (PropertyInfo prop in propInfo) { foreach (var e in helper.ViewData.ModelState[prop.Name].Errors) { TagBuilder div = new TagBuilder("div"); div.MergeAttribute("class", "field-validation-error"); div.SetInnerText(e.ErrorMessage); sb.Append(div.ToString()); } } return sb.ToString(); }

Donde T es el tipo de su "ViewModel".


Versión condensada de la respuesta de @ ChrisMcKenzie :

var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);


<% ViewData.ModelState.IsValid %>

o

<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %>

y para una propiedad específica ...

<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection