2009-11-24 30 views

Respuesta

31

Sobre "puede ser que 0 errores y IsValid == false": aquí está el código fuente de MVC 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.

+0

me parece que no debería, ¿algo está mal en Values.All (modelState => modelState.Errors.Count == 0)? – Omu

+0

Observe que el error puede ser Mensaje o Excepción; por ejemplo Html.ValidationSummary no muestra excepciones (por razones de seguridad, supongo); tal vez es por eso que no ve errores? ¿Cómo verifica si no hay errores? – queen3

+1

ModeloEstado.IsValid da falso – Omu

2

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.

19
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)) 
    { 

    } 
+0

podría ser posible que todos los valores tienen 0 errores y la ModelState seguir siendo válido? – Omu

+1

El modelo statestate tendrá una clave "Propiedad" y un error asociado en el diccionario. el mensaje de error podría estar en blanco, pero el recuento de errores reflejará el recuento de propiedad que no es válido. Porque el método ModelStateDictionary.AddModelError toma una clave y Exception o error String; se requiere agregar un error modelo. –

195

Como es probable que esté programando en Visual Studio que tomaría una mejor ventaja de la posibilidad de utilizar los puntos de interrupción de las medidas de depuración sencillos (obtener 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.

modelstate

+3

¿podría ser posible que todos los valores tengan 0 errores y el modelo de estado aún no sea válido? – Omu

+0

como se dijo anteriormente, no esto no es posible :). ¡En algún lugar debe haber un conteo de errores! = 0. – bastijn

+0

Esta explicación me ayudó mucho. ¡Gracias! – Branislav

10

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

(A menudo, si el ligante 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. 

    } 
+0

Este código fue muy útil para mí, pero iterando los errores (Excepciones) para obtener cada .Message dio como resultado "referencia de objeto no establecida en una instancia de un objeto". Cuando cambié z.Exception a z.ErrorMessage, pude mostrar los mensajes de error. – StackOverflowUser

0

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

4

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(); 
Cuestiones relacionadas