我在最初加载时将结构化数据传递给我的MVC页面。在用户提交联系表单后,我想重新使用相同的数据(我只是“离开”同一页面),所以我不必再次访问数据库。我向控制器声明了一个全局变量来存储模型数据,但是在回发结束时它是null,所以看起来我不能在那里重复使用它。
这似乎是一个典型的场景。我该如何处理?
答案 0 :(得分:4)
如果您想重复使用不会成为回发一部分的viewmodel或其他检索数据,您可以
a)将其输出到隐藏字段中,以便将其发布回您的操作(meh)或
b)将对象存储在Session中,以便它可供应用程序中的任何其他控制器/操作使用。如果您担心内存,可以在重用后删除该会话变量,如果您不需要再次使用它。
在你的初始页面加载时,检查会话变量是否存在,如果存在,你是好的 - 否则填充它。
哦,为什么全局变量的东西不起作用 - >对于每个请求,控制器都是新的(假设使用默认的控制器工厂),因此控制器中的任何全局变量都将在每个请求中重置。
答案 1 :(得分:4)
public ActionResult Foo()
{
var model = GetModelFromDB();
Return View(model);
}
[HttpPost]
public ActionResult Foo(Entity model)
{
Return View(model);
}
Asp.net-mvc是无状态所以每个HTTP请求都有不同的上下文,每次你点击控制器所有它在构造函数中的数据重置,这就是你得到null
的原因
如果模型的属性在提交的表单中,您可以在帖子中获取模型。
答案 2 :(得分:0)
如果您真的不想离开您所在的页面,并且不想像KMan建议的那样发回所有其他数据,但仍想捕获用户的联系信息/数据,您可以发布该联系人info使用ajax。
答案 3 :(得分:-1)
如果您将视图模型作为方法的参数,则可以在回发时将其返回到视图。例如:
public ActionResult TestAction(MyViewModelType testViewModel)
{
//Do logic
return View("view",testViewModel);
}
请注意,您必须在要发布的表单中包含数据。