我试图通过actionLink()
视图调用控制器。此控制器从 TempData 存储库中获取数据。但是,似乎无论我做什么,如果我TempData
在视图中设置存储库,它就不会转到控制器?我应该ViewData
改用吗?您对这样的系统有什么建议?
谢谢
我试图通过actionLink()
视图调用控制器。此控制器从 TempData 存储库中获取数据。但是,似乎无论我做什么,如果我TempData
在视图中设置存储库,它就不会转到控制器?我应该ViewData
改用吗?您对这样的系统有什么建议?
谢谢
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,将数据发送到服务器您应该TempData
在呈现视图的控制器中预先设置该值。然后,该值将被呈现您的第二个 (ActionLink) 视图的控制器操作拾取。