Respuestas:
Acerca de "puede ser que 0 errores e IsValid == false": 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 probablemente esté programando en Visual Studio, será mejor que aproveche la posibilidad de usar puntos de interrupción para pasos de depuración tan sencillos (para hacerse una idea de cuál es el problema como en su caso). Simplemente colóquelos justo en frente / en el lugar donde marca ModelState.isValid y coloque el cursor sobre ModelState. Ahora puede navegar fácilmente a través de todos los valores dentro y ver qué error causa el retorno falso de isvalid.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
te puede ayudar
Pegue el siguiente código en ActionResult 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))
{
}
A veces, un archivador arroja una excepción sin mensaje de error. Puede recuperar la excepción con el siguiente fragmento para averiguar cuál es el problema:
(A menudo, si el archivador intenta convertir cadenas en 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.
}
Si quita la comprobación de ModelsState.IsValid y deja que se produzca un error, si copia esta línea ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
y la pega en la sección de observación en Visual Studio, le dará exactamente cuál es el error. Ahorra mucho tiempo comprobando dónde está el error.
La propiedad ModelState del controlador es en realidad un objeto ModelStateDictionary. Puede iterar a través de las claves en el diccionario y usar el método IsValidField para verificar si ese campo en particular es válido.