2009-05-19 12 views
126

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

Allí verifica que ModelState.IsValid es verdadero. Parece comprobar si el modelo es válido para la base de datos (es decir, capta las conversiones de tipos de datos, como las fechas con formato no válido, pero no las reglas comerciales). ¿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 por completo el cheque 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é el cheque para ModelState.IsValid existe? ¿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); 
} 

Respuesta

124

ModelState.IsValid le indica si cualquier error de modelo se han añadido a ModelState.

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

El modelo de carpeta de referencia DataAnnotations llenará el estado del modelo con los errores de validación tomados de los atributos DataAnnotations de su modelo.

+0

Brad ¿hay alguna manera de saber si un modelo que está decorado con DataAnnotations "IsValid "sin ModeloEstado. (Digamos, por ejemplo, que el objeto se carga desde un archivo o se utiliza en una aplicación de consola, etc.) –

+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. –

+0

@rad, cuando dice "Puede completar ModelState de forma más completa en función del sistema de validación que esté utilizando", ¿cómo se logra? ¿Hay alguna forma de descifrar mi código de validación ModelState para mi ViewModel? Estoy usando EF4, por lo que la mayoría de mi validación es automática de fábrica. – WEFX

24

Desde la Fe de erratas: ModelState.AddRuleViolations(dinner.GetRuleViolations());

debe ser:

ModelState.AddModelErrors(dinner.GetRuleViolations());

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

+4

A partir de 2015, el método 'AddModelErrors' no existe. –

+4

A partir de 2016, el método 'ModelState.AddModelErrors()' existe – John

+4

A partir de 2017, el método no plural 'ModelState.AddModelError' existe. – Zachafer