1

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);
    }
4

2 に答える 2

1

ブラウザーで Step2 ページを検査し、非表示フィールドの値を表示して、値が 2 であることを確認します。

Index(WizardVM)2 の値が Step2 からポストされていることを確認するために、ブレーク ポイントを挿入します。モデルデータから以前の値が復元される場合があります。場合によっては、電話しModelState.Clear()たり、.Remove("ProeprtyName")

これにより、問題がどこにあるかを正確に絞り込むことができます。

于 2013-04-05T14:14:36.767 に答える