1

我在最初加载时将结构化数据传递给我的 MVC 页面。用户提交联系表单后,我想重新使用相同的数据(我只是“离开”相同的页面),所以我不必再次访问数据库。我向控制器声明了一个全局变量来存储模型数据,但在回帖结束时它为空,所以看起来我不能在那里重用它。

似乎这将是一个典型的场景。我该如何处理?

4

4 回答 4

4

如果您想重用视图模型或其他不属于回发的检索数据,您可以

a)在隐藏字段中输出,以便将其发布回您的操作(meh)或

b) 将对象存储在 Session 中,以便应用程序中的任何其他控制器/操作都可以使用它。如果您担心内存问题,如果您不需要再次使用它,则可以在重用它后删除该会话变量。

在您的初始页面加载时,检查会话变量是否存在,如果存在,您很好 ​​- 否则填充它。

哦,为什么全局变量不起作用->为每个请求新建一个控制器(假设使用默认控制器工厂),因此控制器中的任何全局变量都将在每个请求时重置。

于 2012-01-19T19:42:24.230 回答
4
public ActionResult Foo()
{
    var model = GetModelFromDB();
    Return View(model);
}

[HttpPost]
public ActionResult Foo(Entity model)
{
    Return View(model);
}

Asp.net-mvc 是无状态的,因此每个 HTTP 请求都有不同的上下文,每次你点击控制器时,它的所有数据都会在构造函数中重置,这就是你得到null.

如果模型的属性在提交的表单中,您可以在帖子中获取模型。

于 2012-01-19T19:47:33.597 回答
0

如果您真的不想离开您所在的页面,并且不想按照 KMan 的建议将所有其他数据发回,但仍想捕获用户的联系信息/数据,您可以使用 ajax 发布联系信息.

于 2012-01-19T20:24:30.390 回答
-1

如果您将视图模型作为方法的参数,则可以在回发时将其返回到视图。前任:

public ActionResult TestAction(MyViewModelType testViewModel)
{
   //Do logic

    return View("view",testViewModel);

}

请注意,您必须在发布的表单中包含数据。

于 2012-01-19T19:42:22.167 回答