Sr. Grok tenía un sitio similar problema this. Ya había encontrado el ModelState.Clear() solución, pero faltaba una explicación de por qué funcionaba. La respuesta mejor clasificada en el sitio vinculado propuso que el comportamiento del helper html es un error, para el cual ModelState.Clear() es una solución alternativa. Sin embargo, bradwils en this sitio dice que el comportamiento es por diseño, y da la siguiente explicación:
La razón por la que utilizamos el valor publicado por los editores en lugar del valor del modelo es que el modelo puede no ser capaz de contener la valor que el usuario tipeó. Imagine en su editor "int" que el usuario ha escrito "perro". Desea mostrar un mensaje de error que dice "perro no es válido" y deje "perro" en el campo del editor. Sin embargo, su modelo es un int: no hay forma de que pueda almacenar "dog". Así que mantenemos el valor anterior.
Si no desea que los viejos valores en el editor, limpiar el modelo de estados. Ahí es donde se guarda el viejo valor y se extrae de los ayudantes de HTML.
A pesar del hecho de que es por diseño, este comportamiento es muy inesperado para el desarrollador, y es desafortunado que se requiera la interacción con el modelo de estado para una necesidad de programación común.
Por otra parte, la limpieza de toda la ModelState puede causar problemas inesperados en otras áreas (creo que con respecto a la validación de campos del modelo no relacionadas). Así que muchas gracias a Peter Gluck (responder en un comentario dentro de la página del Sr. Grok) para proponer la más limitada ModelState.Remove (“llave”), y Toby J para el desarrollo de un método más conveniente que funciona cuando no está seguro cuál debería ser la clave si la propiedad del modelo está anidada. También me gusta el método de Toby porque no depende de una cadena como entrada.
Ese método, con pequeños cambios, sigue:
/// <summary>
/// Removes the ModelState entry corresponding to the specified property on the model. Call this when changing
/// Model values on the server after a postback, to prevent ModelState entries from taking precedence.
/// </summary>
/// <param name="model">The viewmodel that was passed in from a view, and which will be returned to a view</param>
/// <param name="propertyFetcher">A lambda expression that selects a property from the viewmodel in which to clear the ModelState information</param>
/// <remarks>
/// Code from Tobi J at https://stackoverflow.com/questions/1775170/asp-net-mvc-modelstate-clear
/// Also see comments by Peter Gluck, Metro Smurf and Proviste
/// Finally, see Bradwils http://forums.asp.net/p/1527149/3687407.aspx.
/// </remarks>
public static void RemoveStateFor<TModel, TProperty>(
this ModelStateDictionary modelState,
TModel model,
Expression<Func<TModel, TProperty>> propertyFetcher
) {
var key = ExpressionHelper.GetExpressionText(propertyFetcher);
modelState.Remove(key);
}
'ModelState.Clear();' funciona a la perfección. ¿Puedes explicar porque? – cashmere
Usted me salvó el día. Pero una explicación sería agradable :) –