Estoy usando MVC 3 en mi proyecto, y veo un comportamiento muy extraño.
Estoy tratando de crear un campo oculto para un valor particular en mi Modelo, el problema es que, por alguna razón, el valor establecido en el campo no corresponde al valor en el Modelo.
p.ej
Tengo este código, solo como prueba:
<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>
Creo que ambos campos ocultos tendrían el mismo valor. Lo que hago es establecer el valor en 1 la primera vez que visualizo la Vista, y luego, después del envío, aumento el valor del campo Modelo en 1.
Entonces, la primera vez que renderizo la página, ambos controles tienen el valor 1, pero la segunda vez que los valores renderizados son estos:
<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />
Como puede ver, el primer valor es correcto, pero el segundo valor parece ser el mismo que la primera vez que visualizo la Vista.
¿Qué me estoy perdiendo? ¿Los * For Html helpers almacenan en caché los valores de alguna manera? Si es así, ¿cómo puedo desactivar este almacenamiento en caché?
Gracias por tu ayuda.
Respuestas:
Eso es normal y así es como funcionan los asistentes HTML Primero usan el valor de la solicitud POST y luego el valor en el modelo. Esto significa que incluso si modifica el valor del modelo en la acción de su controlador si hay la misma variable en la solicitud POST, su modificación será ignorada y se usará el valor POSTed.
Una posible solución es eliminar este valor del estado del modelo en la acción del controlador que intenta modificar el valor:
Otra posibilidad es escribir un ayudante HTML personalizado que siempre usará el valor del modelo e ignorará los valores POST.
Y otra posibilidad más:
fuente
Encontré el mismo problema al escribir un asistente que muestra diferentes partes de un modelo más grande en cada paso.
Los datos y / o errores del "Paso 1" se mezclarían con el "Paso 2", etc., hasta que finalmente me di cuenta de que ModelState tenía la "culpa".
Esta fue mi solución simple:
fuente
ModelState.Clear()
resolvió mi problema con solicitudes POST secuenciales en una situación similar.Este código no funcionará
... porque HiddenFor always (!) lee desde ModelState no el modelo en sí. Y si no encuentra la tecla "Paso", producirá el valor predeterminado para ese tipo de variable, que será 0 en este caso
Aquí está la solución. Lo escribí para mí, pero no me importa compartirlo porque veo que muchas personas están luchando con este travieso ayudante de HiddenFor.
Luego solo lo usa como de costumbre desde su vista:
Vale la pena mencionar que también funciona con colecciones.
fuente
Creo que estoy luchando demasiado con la misma situación, donde uso el mismo estado modelo entre llamadas y cuando modifico una propiedad modelo en el back-end. Sin embargo, no me importa si uso textboxfor u hiddenfor.
Simplemente evito la situación usando scripts de página para almacenar el valor del modelo como una variable js, porque necesito el campo oculto para ese propósito al principio.
No estoy seguro si esto ayuda, pero solo considere ...
fuente