1

我对 ASP.NET MVC 很陌生,我遇到了一些看起来应该不费吹灰之力的事情。

使用此视图模型:

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 所以我的视图没有更新。

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

4

1 回答 1

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 中看到它,这就是它以这种方式实现的原因

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

[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 作为参数传递。

于 2013-06-13T14:49:17.987 回答