2009-08-18 11 views
12

Tengo un servicio que tiene un método que se llama cuando se activa un determinado método de controlador.ASP.NET MVC: ModelState vs. ModelStateDictionary

Mi servicio devuelve un objeto de resultado personalizado PlacementResult en el que quiero comunicar los errores que pueden haber sucedido (validación) de nuevo al método del controlador.

¿Debe PlacementResult tener un ModelState o un ModelStateDictionary para comunicar los errores al controlador (y finalmente a la vista)? ¿Cómo podría unir esto?

Finalmente, ¿cómo obtengo el ModelState/ModelStateDictionary (lo que me diga que debería elegir) de nuevo en la vista (resaltando el cuadro de texto apropiado, mostrando el mensaje de error, etc.)?

¡Gracias!

Respuesta

0

No sé lo que su PlacementResult parece, a ver si posiblemente puede utilizar esto en su vista:

ModelState.AddModelError(ErroredProperty, ErrorMessage); 

Asegúrese de que devuelva el objeto que no pudo volver a la vista

return View(myObjectInstance); 
2

No, no desea agregar un ModelStateDictionary a su tipo de resultado. Ya hay un ModelStateDictionary en el controlador (en la propiedad ModelState). No es apropiado para los resultados establecer el estado del modelo del controlador. Eso debería hacerse durante el enlace o dentro de la acción del controlador. Use una carpeta de modelo personalizada si es necesario.

Su elección puede ver los errores de estado del modelo al examinar la propiedad ViewData.ModelState del controlador.

+0

¿Cómo puedo tener mi servicio de hacer la validación, aunque y comunicar su resultado de vuelta al controlador? El ejemplo de MVC era demasiado confuso (hay uno en el sitio asp.net/mvc para esto pero no lo entendí) – Alex

+0

¿Puedes esperar a la próxima vista previa de MVC 2? Creo que pretenden introducir un marco de validación más robusto. En MVC 1 puede implementar IDataErrorInfo, y en MVC 2 preview 1 puede usar System.ComponentModel.DataAnnotations. –

+0

¿Cuándo sale? – Alex

0

Basado en SoC Creo que debe devolver los errores de sus servicios y fusionarlos en su ModelState si es necesario.

Pero nuestro objetivo es mantener el desacoplamiento y también utilizar el método ModelState.Merge(). no es?

Hay un concrete implementation que podría ayudar a

0

puede pasar el controlador a su método, ya que la clase controlador contiene la propiedad ModelState. Una vez en su método que se puede hacer lo siguiente:

private PlacementResult BuildResult(Controller controller) 
{ 
    controller.ModelState.AddModelError(propertyName, errorMessage); 
} 

En su acción ...

BuildResult(this); 
if(ModelState.IsValid) {... 
1

Su PlacementResult debe devolver un objeto de diccionario o una lista que debe fusionarse con el estado en el modelo comienzo de cada acción.

Si lo ve, el diccionario de estado del modelo de los controladores contiene todos sus campos de entrada, sus valores y los errores asociados a ellos. Desea fusionar los errores de PlacementResult en el diccionario de estado modelo en las teclas correspondientes. Así es como el motor de visualización sabe qué campos marcar como no válido.

ModelState.Merge(PlacementResult); 
if(ModelState.IsValid) 
{ 
    ... 
} 
Cuestiones relacionadas