关于ASP.NET MVC 2:TempData从视图移动到控制器

TempData moving from view to controler

我正在尝试通过视图中的actionLink()调用控制器。该控制器从TempData存储库获取数据。但是,似乎不管我做什么,如果我在视图中设置了TempData存储库,它将不会传递给控制器???我应该改用ViewData吗?您对诸如此类的系统有何建议?

谢谢


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


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

如果要在两次重定向之间保留信息,可以使用

TempData。它应该在控制器动作中设置,该动作将重定向到另一个将读取数据的控制器动作:

1
2
3
4
5
6
7
8
9
10
11
12
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请求或重定向发送到服务器