asp.net-mvc-2 - the - model binding mvc 5
Establecer valores de ModelState en el archivador de modelo personalizado (1)
Estoy usando una carpeta de modelo personalizado en ASP.NET MVC 2 que se ve así:
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 regreso de esta carpeta a la acción del controlador, mi objeto comercial que se proporciona como parámetro para la acción se altera 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 del clasificador de modelo personalizado?
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.
Me gusta esto:
bindingContext.ModelState.Remove("Slug");
bindingContext.ModelState.Add("Slug", new ModelState());
bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));