1

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

谢谢

4

2 回答 2

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 种技术:

  • 使用<form>带有输入字段的 HTML,将数据发送到服务器
  • 使用锚点并将数据作为查询字符串参数传递给控制器
  • 使用 javascript 并向服务器发送 AJAX 请求或重定向
于 2011-12-01T13:05:05.060 回答
2

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

于 2011-12-01T13:08:36.103 回答