単一のコントローラー アクションを使用し、モデルの値に応じてビューを返す複数ページ フォームを試みています。
私のモデルには、Html.HiddenFor() を使用してビューの入力フィールドに配置したプロパティがあります。
これが私の単純化されたモデルです:
public class MyModel
{
public virtual int Step { get; set; }
}
そして私の見解では、私は持っています:
@model MyModel
...
@Html.HiddenFor(model => model.Step)
次に、コントローラーに次のものがあります。
public ActionResult Create()
{
...
myModel.Step = 1;
return View("View1", myModel);
}
[HttpPost]
public ActionResult Create(MyModel myModel)
{
...
if (myModel.Step == 1)
{
myModel.Step = 2;
return View("View2", myModel);
}
else if (myModel.Step == 2)
{
...
}
...
}
私の問題は、コントローラーが常に mymodel.Step の値を 1 として認識していることです。なぜですか?
奇妙なのは、これらを使用してフォームに表示しようとしたことです。
@Html.DisplayFor(model => model.Step)
@Html.EditorFor(model => model.Step)
ページが 2 回目に表示されたとき、最初の行にテキスト "2" が表示されました。2 つ目は、「1」の入力フィールドを示しています。よくわかりません。
追加情報:
私のモデルには、隠しフィールドのビューに渡される Guid プロパティもあります。ポストバックでも変更して、その値をもう一度確認してみました。新しい値は登録されませんでした。モデルは、最初のポストの前に元の値を返しました。したがって、それは他の分野と一致しています。
現時点での動作の理由がわからない場合は、別のコントローラー アクションを使用する必要があるかもしれません。
解決:
Reda が以下で提案したように、ポスト アクション メソッドでこれを実行して修正しました。
- 「View2」を表示する前に、コントローラーがモデルの値に加えた変更を有効にするために、ModelState.Clear() を実行します。
このシナリオでは ModelState をクリアする必要があることを確認するブログ投稿を次に示します。