TempData从视图移动到控制器
我试图在视图中通过actionLink()
调用控制器。该控制器从TempData存储库中获取数据。但是,似乎无论我做什么,如果我在视图中设置TempData
存储库,它不会转到控制器?我应该用ViewData
代替吗?你对这样的系统有什么建议?TempData从视图移动到控制器
谢谢
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请求或重定向到服务器
我害怕这一点。那么,如果从TempData存储库获取数据,那么如何处理页面从按钮(从表单创建)刷新?目前通过按钮刷新,我只需再次从actionLink调用控制器......存在这个问题。该控制器从TempData存储库中获取一些信息。如果我打电话,它的空页面将无法正确重新加载。有没有更好的方法来做到这一点? – SoftwareSavant
@DmainEvent,这正是TempData的一个问题。页面用F5刷新。它可能是一个PITA。我个人从不使用TempData。如果我需要坚持一些东西,以便它能够在页面刷新后继续存在,我会将其保留在我的后端,以便我可以随时根据其唯一标识符检索它。 TempData实际上应该用于非常短暂的对象存储机制:比如通知消息等。 –
你会如何将它存储在后端?像数据库一样,还是有像使用会话这样的机制? – SoftwareSavant
应设置预先显示您的视图的控制器中的值。然后该值将由呈现您的第二个(ActionLink)视图的控制器操作获取。
你不应该从视图中设置TempData,如果你需要的话,考虑改变你的设计 –