1

単一のコントローラー アクションを使用し、モデルの値に応じてビューを返す複数ページ フォームを試みています。

私のモデルには、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 をクリアする必要があることを確認するブログ投稿を次に示します。

4

1 に答える 1

4

通常、投稿アクションからビューに戻るときは、検証プロセス中に何かが失敗したことを意味し、送信された値でフォームが再度表示される必要があります。そのため、ModelStateビューに戻ったときに入力が記憶され、入力はModelStateビュー モデルではなく から入力されます。

私の意見では、2 つの解決策があります。

  • ModelState.Clear、新しい値を設定する前に、古い値を消去します
  • 新しい値を使用して GET アクションにリダイレクトする

検証エラーのある古いフォームを表示しているのではなく、異なる値を持つ新しいビューを表示しているだけなので、2 番目の解決策の方が優れています。

これが例です(もちろん、ニーズに合わせて調整します):

public ActionResult Create(int? step)
{
    ...
    myModel.Step = step.HasValue ? step.Value : 1; // or whatever logic you need to apply
    return View("View1", myModel);
}

[HttpPost]
public ActionResult Create(MyModel myModel)
{
    ...
    if (myModel.Step == 1)
    {
        return RedirectToAction("Create", new { step = 2 });
    }
    else if (myModel.Step == 2)
    {
        ...
    }
    ...
}
于 2013-11-12T09:40:32.717 に答える