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.
Acerca de "puede ser que 0 errores e IsValid == falso": aquí está el código fuente MVC de https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41
public bool IsValid {
get {
return Values.All(modelState => modelState.Errors.Count == 0);
}
}
Ahora, parece que no puede ser. Bueno, eso es para ASP.NET MVC v1.
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))
{
}