Tengo un problema que aparece en un formulario que intento publicar. En el escenario donde el formulario no se valida, tomo la ruta estándar de llamar al ModelState.AddModelError()
y luego devolver un resultado de Vista.ASP.Net MVC ModelState/Html.TextBox postback issue
Lo que pasa es que los helpers HTML * se supone que recogen el valor publicado al renderizar y me doy cuenta de que mis campos de texto SÓLO lo hacen si los incluyo en la lista de parámetros de la acción de devolución, que shouldn No se requiere ver, ya que algunos formularios tienen demasiados campos para querer enumerarlos todos como parámetros.
Mi código de acción es más o menos:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name)
{
var dataDefinition = ...
// do some validation stuff
if (!ModelState.IsValid)
{
// manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P
// ...
return View(dataDefinition);
}
}
Ahora, DataDefinition (que es un LINQ a entidad SQL) tiene un campo MinVolume, que se maneja en la vista por esta línea:
Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>
Sin embargo, cuando la vista se representa después de una validación fallida de ModelState, el valor escrito en la página original que publicamos no se conserva A MENOS QUE lo incluya como parámetro en el método de devolución de datos. Literalmente, puedo "resolver el problema" al hacer esto:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)
Por alguna razón que forzará el valor del campo para ser preservado. Esto me parece estúpido porque mi formulario tiene mucho más valor que eso y no debería tener que agregar un parámetro solo para ese campo.
¿Alguna idea?
No, se especifica que null especifica que el contexto del modelo existente se debe usar para consultar el valor. La especificación de MinVolume es explícita y obligaría a usar ese valor en lugar de lo que se envió anteriormente. –
Incorrecto. Especificando MinVolume busca ViewDataDoctionary y luego ModelStateDictionary para publicaciones posteriores. Entonces, si Model.MinVolume es decir 5 edición de núcleo, entonces la especificación de MinVolume colocará 5 en el TextBox. Luego, si se realiza una publicación (digamos valor 3) pero no es válida, TextBox mostrará 3 la segunda ronda. ¿Lo has probado? Por lo general, especifica nulo en una vista 'Nuevo' o 'Crear' para que la publicación inicial muestre vacío en el campo, y las publicaciones subsiguientes conserven el valor ingresado. –
Esta es exactamente la manera en que yo también lo hago y siempre funciona. Nunca vi en ninguna parte que tengas que especificar null. Un enlace a donde viste eso sería bueno. – sirrocco