¿Para qué es válido ModelState.IsValid en ASP.NET MVC en NerdDinner?

148

En el ejemplo NerdDinner de Professional ASP.NET MVC 1.0 hay un método para crear una nueva cena como se copia a continuación (página 89 de la versión gratuita de NerdDinner).

Allí comprueba que ModelState.IsValid sea verdadero. Parece verificar si el modelo es válido para la base de datos (es decir, captura conversiones de tipos de datos, como fechas con formato no válido, pero no reglas de negocios). ¿Es eso cierto?

Al enviar el formulario, si tiene un error en la fecha, ModelState.IsValid será falso y obtendrá un error, pero solo para la fecha porque AddRuleViolations nunca se ejecutó. Si elimina completamente la verificación de ModelState.IsValid, obtendrá todos los errores (debido a la excepción), incluida una marca en la fecha en que no es válida. Entonces, ¿por qué está ahí la comprobación de ModelState.IsValid? ¿Me estoy perdiendo de algo?

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 
pupeno
fuente

Respuestas:

143

ModelState.IsValidle indica si se han agregado errores de modelo ModelState.

El enlazador de modelos predeterminado agregará algunos errores para problemas de conversión de tipo básico (por ejemplo, pasar un no número para algo que es un "int"). Puede completar ModelState de forma más completa según el sistema de validación que esté utilizando.

La DataAnnotationscarpeta del modelo de muestra llenará el estado del modelo con errores de validación tomados de los DataAnnotationsatributos de su modelo.

Brad Wilson
fuente
Brad hay alguna manera de averiguar si un modelo que está decorado con anotaciones de datos "es válido" sin ModelState. (Digamos, por ejemplo, que el Objeto se carga desde un archivo o se usa en una Aplicación de Consola, etc.)
runxc1 Bret Ferrier
1
No, ModelState.IsValid es la única forma de saber si hubo errores de validación (o conversión de datos) durante el enlace del modelo.
Brad Wilson
@Brad, cuando dices "Puedes llenar ModelState más completamente en función del sistema de validación que estés usando", ¿cómo se logra eso? ¿Hay alguna manera de abrir mi código de validación ModelState para mi ViewModel? Estoy usando EF4, por lo que la mayor parte de mi validación es automática fuera de la caja.
WEFX
13
Uso: var errors = ModelState.Values.SelectMany(v => v.Errors);con un punto de interrupción para ver cualquier problema de validación.
full_prog_full
A veces es un error en la tabla relacionada si se han cambiado los nombres de las propiedades, no se han realizado migraciones y, como resultado, SaveChanges (); falla y no puede ocurrir debido al cambio.
Oracular Man
25

De la errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Debiera ser:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Referencia: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html

Kelly Orr
fuente
55
A partir de 2015, el AddModelErrorsmétodo no existe.
Felipe Correa
66
A partir de 2016, el ModelState.AddModelErrors()método existe
John
77
A partir de 2017, ModelState.AddModelErrorexiste el método no plural .
Zachafer
0

Sí, Jared y Kelly Orr tienen razón. Yo uso el siguiente código como en la excepción de edición.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

en vez de

ModelState.AddRuleViolations(dinner.GetRuleViolations());
Phoe Htoo
fuente
0

Todos los campos del modelo que tienen tipos definidos, deben validarse cuando se devuelven al controlador. Si alguno de los campos del modelo no coincide con su tipo definido, ModelState.IsValid devolverá falso. Porque, estos errores se agregarán en ModelState.

B.Khan
fuente