MVC向导问题

时间:2013-04-05 01:34:40

标签: asp.net-mvc asp.net-mvc-3 viewmodel wizard

我正在尝试在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);
    }

2 个答案:

答案 0 :(得分:1)

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

Index(WizardVM)中设置一个断点来检查是否从Step2发布了2的值。有些情况下,先前的值将从模型数据中恢复。有时您需要致电ModelState.Clear().Remove("ProeprtyName")

这样您就可以准确缩小问题所在的范围。

答案 1 :(得分:1)

感谢AaronLS指出我正确的方向。需要的更改如下所示。

在查看页面中,将HiddenFor更改为隐藏,如此...

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

并修改Controller以删除每个帖子的隐藏字段,如此...

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

获得解决方案的Darin Dimitrov