2010-04-06 8 views
14

que estoy usando ligante modelo personalizado de ASP.NET MVC 2 que tiene este aspecto:Valores de ajuste ModelState en ligante modelo personalizado

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 
     if (bindingContext == null) 
     { 
      throw new ArgumentNullException("bindingContext"); 
     } 

     BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext); 
     if(string.IsNullOrWhiteSpace(obj.Slug)) 
     { 
      // creating new object 
      obj.Created = obj.Modified = DateTime.Now; 
      obj.ModifiedBy = obj.CreatedBy = controllerContext.HttpContext.User.Identity.Name; 
      // slug is not provided thru UI, derivate it from Title; property setter removes chars that are not allowed 
      obj.Slug = obj.Title; 
      ModelStateDictionary modelStateDictionary = bindingContext.ModelState; 
      modelStateDictionary.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null)); 
... 

Cuando vuelva de esta carpeta en la acción del controlador, mi objeto de negocio que es proporcionado como un parámetro para que la acción se altere correctamente (las líneas obj.Created = .... work).

Sin embargo, ModelState no se actualiza. Lo sé porque tengo Requerido en la propiedad Slug de mi objeto comercial y aunque modifiqué ModelStateDictionary en mi carpeta de modelo personalizado, proporcionándole un Slug (como puede ver arriba), el ModelState.IsValid sigue siendo falso.

Si pongo ModelState ["Slug"] en mi ventana de vigilancia en la sesión de depuración, dice que tiene errores (1), por lo que aparentemente está vacío y, como tal, falla.

¿Cómo puedo alterar correctamente el ModelState dentro del código de carpeta de modelo personalizado?

Respuesta

19

Aparentemente, no hay forma de revalidar el modelo de estado una vez que cambia el valor de alguna clave. IsValid sigue siendo falso porque establecer un nuevo valor para alguna clave no desencadena la revalidación.

La solución es eliminar primero la clave que activó IsValid para que sea falsa, recrearla y asignarle el valor. Cuando lo hace, el modelo se revalida automáticamente y, si todo está bien, IsValid devuelve verdadero.

De esta manera:

bindingContext.ModelState.Remove("Slug"); 
bindingContext.ModelState.Add("Slug", new ModelState()); 
bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null)); 
+1

Su solución tiene que ser pegajosos en stackoverflow. He estado buscando y experimentando hasta que encontré esto tuyo. Te garantizo, no mucha gente sabe de este truco. ¡Salvaste mis días! ¡Gracias! – Stack0verflow

+0

Intenté su solución, y funcionó para mi situación. ¿Podría echar un vistazo a mi pregunta en http://stackoverflow.com/questions/23145780/asp-net-mvc-4-how-to-validate-my-model-in-a-custom-model-binder? ¡Gracias! – Stack0verflow

Cuestiones relacionadas