未保留模型值

时间:2013-06-13 14:28:31

标签: asp.net-mvc-4

我对ASP.NET MVC很陌生,而且我遇到的问题似乎应该是不费脑子的。

使用此ViewModel:

public enum Step
{
    One = 1,
    Two = 2,
    Three = 3
}

public class TestViewModel
{
    public string Description
    {
        get
        {
            return "Current step is " + this.Step;
        }
    }

    public Step Step { get; set; }
    public string Dummy{ get; set; }

    public TestViewModel()
    { }

    public TestViewModel(Step step)
    {
        this.Step = step;
    }
}

和这个观点:

@using MvcApplication1
@model TestViewModel

@using (Html.BeginForm("Test", "Home"))
{
    if (Model.Step == Step.One)
    {
    @Html.HiddenFor(m => m.Step)
    @Html.HiddenFor(m => m.Dummy)
    <p>@Model.Description</p>
    }
    else if (Model.Step == Step.Two)
    {
    @Html.HiddenFor(m => m.Step)
    @Html.HiddenFor(m => m.Dummy)
    <p>@Model.Description</p>
    }
    else if (Model.Step == Step.Three)
    {
    @Html.HiddenFor(m => m.Step)
    @Html.HiddenFor(m => m.Dummy)
    <p>@Model.Description</p>
    }
    <input type="submit" value="Continue" />
}

和这个控制器:

public ActionResult Test()
{
    TestViewModel model = new TestViewModel(Step.One);
    return View(model);
}

[HttpPost]
public ActionResult Test(TestViewModel model)
{
    Debug.Print("Enter: Step = {0}", model.Step);

    switch (model.Step)
    {
        case Step.One:
            model.Step = Step.Two;
                    model.Dummy = "2";
            break;
        case Step.Two:
            model.Step = Step.Three;
                    model.Dummy = "3";
            break;
        case Step.Three:
            model.Step = Step.One;
                    model.Dummy = "1";
            break;
    }

    Debug.Print("Enter: Step = {0}", model.Step);

    return View(model);
}

在第一次按下按钮时,控制器将model.Step设置为Step.Two并且我的视图已正确更新。

但是在按钮model.Step的第二个(以及任何后续)点击中,它被读作Step.One而不是Step.Two,因此我的视图上没有更新任何内容。

我有什么明显的遗失吗?为什么没有正确读取/保存值?

1 个答案:

答案 0 :(得分:2)

您的视图中不需要if else块。你基本上做同样的事情。这也有效:

@using (Html.BeginForm("Test", "Home"))
{
    @Html.HiddenFor(m => m.Step)
    <p>@Model.Description</p>

    <input type="submit" value="Continue" />
}

发布表单后,您将在同一操作中返回一个视图。 ASP.NET MVC仅在HTML帮助程序中使用POST请求中的值,忽略操作中的更新值。在您提出第一个请求后,您可以在HTML中看到它,这里是the reason why it's implemented that way

我建议实施Post-Redirect-Get pattern。更新值后,重定向到其他操作。

[HttpPost]
public ActionResult Test(TestViewModel model)
{
    Debug.Print("Enter: Step = {0}", model.Step);

    switch (model.Step)
    {
        case Step.One:
            model.Step = Step.Two;
            break;
        case Step.Two:
            model.Step = Step.Three;
            break;
        case Step.Three:
            model.Step = Step.One;
            break;
    }

    Debug.Print("Enter: Step = {0}", model.Step);

    return RedirectToAction("SomeAction", model);
}

这会将模型序列化为查询字符串。更好的方法是将一些ID作为参数传递。