TempData从视图移动到控制器

时间:2011-12-01 13:00:05

标签: asp.net-mvc-2 tempdata

我试图通过视图中的actionLink()调用控制器。该控制器从TempData存储库获取数据。但是,似乎无论我做什么,如果我在视图中设置TempData存储库,它都不会转到控制器?我应该使用ViewData吗?你对这样的系统有什么建议?

由于

2 个答案:

答案 0 :(得分:2)

TempData,也不应该在视图中设置ViewData。视图应该使用存储在控制器操作内的那些结构中的数据(实际上它不是,视图应该使用视图模型,但这是另一个主题)。

当您想要在两个重定向之间保留信息时,可以使用TempData。它应该在一个控制器动作中设置,该动作重定向到另一个将读取数据的控制器动作:

public ActionResult Foo()
{
    SomeModel model = ...
    TempData["foo"] = model;
    return RedirectToAction("Bar");
}

public ActionResult Bar()
{
    var model = TempData["foo"] as SomeModel;
    ...
}

因此,只有在从另一个设置数据的操作重定向后调用此操作时,控制器操作才应从TempData结构获取数据。永远不应该从视图中调用此类控制器操作,因为如果您有视图,则意味着此视图是从控制器操作呈现的,该操作可能将数据设置为TempData,但始终存在风险(如果视图在请求之间执行服务器--AJAX或其他东西),TempData将丢失。

对于您的情况,当视图需要调用服务器时,基本上有3种技术:

  • 将HTML <form>与包含将数据发送到服务器的输入字段
  • 一起使用
  • 使用锚点并将数据作为查询字符串参数传递给控制器​​
  • 使用javascript并发送AJAX请求或重定向到服务器

答案 1 :(得分:2)

您应该在呈现视图的控制器中预先设置TempData值。然后,该值将由呈现第二个(ActionLink)视图的控制器操作获取。