Questo comportamento mi sta facendo chiedo per la mia sanità mentale ..se il valore cambia a modello dopo post, Modulo mostra ancora vecchio valore
Ho una forma che ha due posti che accettano input, chiamiamoli valoreA e valoreB. L'utente può inserire un valore in uno e il modulo viene inviato.
<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>
L'azione di controllo è simile al seguente:
public ActionResult MyControllerAction(MyViewModel viewModel)
{
// fare altre cose ...
return PartialView("MyPartialView", viewModel);
}
Il ViewModel è semplicemente questo:
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;
}
}
}
Ora, il pezzo inaspettato. Dire che la pagina inizialmente carica e ValoreB ha un valore di 7. L'utente modifica ValoreA a 5 e il modulo viene inviato. Posso inserire un punto di interruzione nell'azione del controller e vedere entrambi i valori nel parametro viewModel. A questo punto, ValoreA è 5 e ValoreB è 0 (a causa dell'impostazione di ValoreA). L'azione restituisce viewModel come parte di PartialView. Indietro nel parziale, posso mettere un punto di interruzione sulla Html.TextBox ("ValueB", Model.ValueB, ...) la linea e vedere che è davvero ValueB 0. Ma quando la forma rende al browser, ValueB ha ancora un valore di 7. E questo è dove sono bloccato. Ho anche cambiato il bersaglio Update per un div diverso, in modo che il parziale appena sputa il modulo in un posto completamente diverso, ma ha ancora il valore originale di 7, anche se ho visto attraverso il debug che il valore è stato 0 tornando dalla controller.
C'è qualcosa che mi manca?
Mi sono reso conto che c'è un leggero difetto nel mio esempio, ma il problema si verifica ancora. Invece di azzerare l'altro valore nel modello di vista, tale logica deve avvenire nell'azione del controllore, poiché non posso garantire la precedenza delle impostazioni della proprietà durante l'associazione del modello. –