MVC でウィザードを作成しようとしています。各ステップの後に DB に送信する必要があるため、このクライアント側を処理する代わりに、データをコントローラーに戻したいと考えています。私は一生、自分が間違っていることを理解することはできません。各ステップの ViewModel を含む ViewModel と、現在の場所を追跡するための StepIndex があります。各ステップ ページは、含まれている ViewModel に対して厳密に型指定されています。何らかの理由で StepIndex をインクリメントすると、コントローラーでインクリメントされていることが示されますが、保持されません。これには非表示の値があり、Step1 の値が渡されます。私は model.StepIndex++ と model.StepIndex + 1 を試しました。どちらもコントローラに増分として表示されますが、ビューが読み込まれると、間違った値が使用されます。それが原因であるかどうかを確認するために、キャッシュをオフにしました。私が間違っていることを見たら教えてください。ありがとう、TJ
ビューモデルを含む
public class WizardVM
{
public WizardVM()
{
Step1 = new Step1VM();
Step2 = new Step2VM();
Step3 = new Step3VM();
}
public Step1VM Step1 { get; set; }
public Step2VM Step2 { get; set; }
public Step3VM Step3 { get; set; }
public int StepIndex { get; set; }
}
Step2 見る
@model WizardTest.ViewModel.WizardVM
@{
ViewBag.Title = "Step2";
}
<h2>Step2</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Step1.Foo)
@Html.HiddenFor(model => model.StepIndex)
<fieldset>
<legend>Step2VM</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Step2.Bar)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Step2.Bar)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
コントローラ
public ActionResult Index()
{
var vm = new WizardVM
{
Step1 = { Foo = "test" },
StepIndex = 1
};
return View("Step1", vm);
}
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
[HttpPost]
public ActionResult Index(WizardVM model)
{
switch (model.StepIndex)
{
case 1:
model.StepIndex = model.StepIndex + 1;
return View("Step2", model);
case 2:
model.StepIndex = model.StepIndex + 1;
return View("Step3", model);
case 3:
//Submit here
break;
}
//Error on page
return View(model);
}