Este comportamiento está haciendo que me pregunte acerca de mi cordura ..Si cambia el valor de modelo después de POST, la Forma sigue mostrando valor anterior
Tengo un formulario que tiene dos lugares que aceptan la entrada, llamémosles ValorA y ValorB. El usuario puede ingresar un valor en cualquiera de los dos y el formulario envía.
<div id="MyUpdateTarget">
<% using (Ajax.BeginForm("MyControllerAction", new AjaxOptions { UpdateTargetId = "MyUpdateTarget" })) { %>
<%=Html.TextBox("ValueA", Model.ValueA, new Dictionary<string, object> {
{ "onchange", "$('#SubmitButton').click(); return false;" },
}) %>
<%=Html.TextBox("ValueB", Model.ValueB, new Dictionary<string, object> {
{ "onchange", "$('#SubmitButton').click(); return false;" },
}) %>
<input id="SubmitButton" type="submit" value="Save" style="display: none;" />
<% } %>
</div>
la acción del controlador se ve así:
public ActionResult MyControllerAction(MyViewModel viewModel)
{
// hacer algunas otras cosas ...
return PartialView("MyPartialView", viewModel);
}
El modelo de vista es simplemente esto:
public class MyViewModel
{
private int _valueA;
private int _valueB;
public int ValueA
{
get
{
return _valueA;
}
set
{
if (value > 0)
{
ValueB = 0;
}
_valueA = value;
}
}
public int ValueB
{
get
{
return _valueB;
}
set
{
if (value > 0)
{
ValueA = 0;
}
_valueB = value;
}
}
}
Ahora, la pieza inesperada. Supongamos que la página se carga inicialmente y ValueB tiene un valor de 7. El usuario cambia ValueA a 5 y envía el formulario. Puedo poner un punto de interrupción en la acción del controlador y ver ambos valores en el parámetro viewModel. En este punto, ValueA es 5 y ValueB es 0 (debido a la configuración de ValueA). La acción devuelve viewModel como parte de PartialView. De vuelta en el parcial, puedo poner un punto de interrupción en el Html.TextBox ("ValorB", Model.ValueB, ...) de la línea y ver que es de hecho ValorB 0. Pero cuando la forma hace al navegador, ValorB todavía tiene una valor de 7. Y aquí es donde estoy atascado. Incluso he cambiado el objetivo de actualización a un div diferente, por lo que el parcial simplemente escupe la forma en algún lugar completamente diferente, pero todavía tiene el valor original de 7, a pesar de que he visto a través de depuración que el valor de 0 a volver desde el controlador.
¿Hay algo que me falta?
Me di cuenta de que hay un pequeño error en mi ejemplo, pero el problema persiste. En lugar de poner a cero el otro valor en el modelo de vista, esa lógica debe ocurrir en la acción del controlador, ya que no puedo garantizar la prioridad de configuración de propiedad durante el enlace del modelo. –