この振る舞いは、私の正気について不思議に思っています。
入力を受け入れる2つの場所があるフォームがあります。それらをValueAとValueBと呼びましょう。ユーザーはどちらかに値を入力すると、フォームが送信されます。
<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>
コントローラのアクションは次のようになります。
public ActionResult MyControllerAction(MyViewModel viewModel)
{
//他のことをします...
return PartialView("MyPartialView", viewModel);
}
ViewModelは単純にこれです:
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;
}
}
}
さて、意外な作品。ページが最初に読み込まれ、ValueBの値が7であるとします。ユーザーがValueAを5に変更すると、フォームが送信されます。コントローラアクションにブレークポイントを設定し、viewModelパラメータで両方の値を確認できます。この時点で、ValueAは5で、ValueBは0です(ValueAの設定による)。このアクションは、PartialViewの一部としてviewModelを返します。部分に戻ると、Html.TextBox( "ValueB"、Model.ValueB、...)行にブレークポイントを設定して、ValueBが実際に0であることを確認できます。ただし、フォームがブラウザーにレンダリングされるとき、ValueBにはまだ値7。そして、これは私が立ち往生しているところです。Updateターゲットを別のdivに変更したので、パーシャルは完全に異なる場所にフォームを吐き出しますが、元の値は7のままです。
足りないものはありますか?