【问题标题】:Persisting MVC4 controller data thru multiple post backs通过多个回发保持 MVC4 控制器数据
【发布时间】:2012-09-03 12:54:55
【问题描述】:

我有一个 MVC4 控制器,它多次调用它的视图,每次都使用一组不同的 ViewBags。视图通过以下方式根据这些 ViewBag 的存在与否呈现表单的内容:

@using (Html.BeginForm())
{
    @if (ViewBag.Foo1 != null)
    {
        @Html.DropDownList("Bar1",....
    }

    @if (ViewBag.Foo2 != null)
    {
        @Html.DropDownList("Bar2",....
    }

    <input name="ActionButton" type="submit" value="Ok"" />
}

每次用户单击提交按钮时,控制器都会检查集合中的内容,并在再次调用视图之前创建一组新的 ViewBag,有点像这样:

public ActionResult Create()
{
    ViewBag.Foo1 = "blawblaw";
    return View();
}

[HttpPost]
public ActionResult Create(FormCollection collection)
{
    if (collection["Bar1"] != null)
    {
        string FirstPass = collection["Bar1"];
        ViewBag.Foo2 = "blawblaw";
    }

    if (collection["Bar2"] != null)
    {
        string SecondPass = collection["Bar2"];
        ViewBag.Foo3 = "blawblaw";
    }

    return View();
}

我现在需要做的是以某种方式让每次通过控制器“记住”一些关于其先前通过的信息。也就是说,在我的示例中,第二次通过控制器(collection["Bar2"] 为 true 的那个),FirstPass 的值为 null。

我该怎么做?

【问题讨论】:

  • 听起来您正在尝试使用 MVC 重新创建 WebForm,这不是正确的方法。 MVC 应该是无状态的——它不会“记住”任何关于用户已经发布到它的内容,除非你将这些数据保存在某个地方(数据库)。您应该查看模型绑定而不是过度使用 viewbag,并且还使用不同的控制器。不要试图通过相同的 url 强制所有内容,否则您可能会陷入this trap
  • 我明白了......但是这个应用程序的 90% 是直接的 MVC CRUD 功能,而 MVC 非常适合那里。然而,在这一页上,我需要引导用户通过几个步骤来收集我需要的详细信息,然后再对模型进行更新。

标签: asp.net-mvc-4 viewbag


【解决方案1】:

在这种情况下,请查看在 MVC 中实现向导的最佳实践。一些good suggestions here。就个人而言,我仍然会考虑使用单独和不同的网址。此外,如果您的解决方案中有 db 访问权限,您仍然可以在更新主模型之前存储临时数据。想想如果用户第一次没有完成整个旅程,你希望发生什么......

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2012-02-18
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多