MVC向导问题



我试图在MVC中创建一个向导。因为我需要提交的东西,每一步后的DB,我想把数据传递回控制器,而不是处理这个客户端。但我无论如何也弄不清楚我到底做错了什么。我有一个包含每个步骤的ViewModel和一个用于跟踪我所处位置的StepIndex的ViewModel。每个步骤页面都是对包含ViewModel的强类型的。由于某种原因,当我增加StepIndex时,它显示它在控制器中增加了,但它从未被保留。我为它设置了一个隐藏值,并传递了Step1值。我试过做模特。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; }
}

步骤2视图

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

在浏览器中检查Step2页面并查看隐藏字段的值,以确保它的值为2。

Index(WizardVM)中设置一个断点来检查2的值是否从Step2传入。在某些情况下,以前的值将从模型数据中恢复。有时需要调用ModelState.Clear().Remove("ProeprtyName")

谢谢AaronLS给我指出了正确的方向。以上需要做的修改如下:

在View页面将HiddenFor改为Hidden,如下所示

@Html.Hidden("StepIndex", Model.StepIndex)

并修改控制器以删除每个帖子的隐藏字段,如下所示…

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpPost]
    public ActionResult Index(WizardVM model)
    {
        ModelState.Remove("StepIndex");

感谢Darin Dimitrov的解决方案。

相关内容

  • 没有找到相关文章

最新更新