validaciones side net mvc modelstatedictionary isvalid for errors custom asp addmodelerror asp.net-mvc modelstate

asp.net-mvc - side - validaciones asp net mvc



ModelState.IsValid== falso, ¿por qué? (7)

A veces, una carpeta arroja una excepción sin mensaje de error. Puede recuperar la excepción con el siguiente fragmento para descubrir cuál es incorrecto:

(A menudo, si la carpeta está tratando de convertir cadenas a tipos complejos, etc.)

if (!ModelState.IsValid) { var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception)); // Breakpoint, Log or examine the list with Exceptions. }

¿Dónde puedo encontrar la lista de errores que hacen que el modelo de estado no sea válido? No vi ninguna propiedad de errores en el objeto ModelState.



Como me acaba de ocurrir, esto también puede suceder cuando agrega una propiedad requerida a su modelo sin actualizar su formulario. En este caso, el ValidationSummary no mostrará el mensaje de error.


Como probablemente estés programando en Visual Studio, es mejor que aproveches la posibilidad de usar puntos de interrupción para esos pasos de depuración fáciles (tener una idea de cuál es el problema, como en tu caso). Simplemente colóquelos justo enfrente / en el lugar donde verifica ModelState.isValid y desplace el cursor sobre el ModelState. Ahora puede navegar fácilmente por todos los valores que están dentro y ver qué error hace que el retorno inválido sea falso.


La propiedad ModelState en el controlador es en realidad un objeto ModelStateDictionary. Puede recorrer las teclas del diccionario y usar el método IsValidField para verificar si ese campo en particular es válido.


Pegue el código siguiente en el resultado de acción de su controlador y coloque el depurador en este punto.

var errors = ModelState .Where(x => x.Value.Errors.Count > 0) .Select(x => new { x.Key, x.Value.Errors }) .ToArray();


bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

o iterar con

foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0)) { }