TempData moving from view to controler
我正在尝试通过视图中的actionLink()调用控制器。该控制器从TempData存储库获取数据。但是,似乎不管我做什么,如果我在视图中设置了TempData存储库,它将不会传递给控制器???我应该改用ViewData吗?您对诸如此类的系统有何建议?
谢谢
- 您不应该从视图中设置TempData,如果需要,请考虑更改设计
您应该在呈现视图的控制器中预先设置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请求或重定向发送到服务器
- 我以前很怕那个。那么,如果您已从TempData存储库中获取数据,那么如何通过按钮(从表单创建)来刷新一个处理页面呢?当前通过按钮刷新,我只是简单地从actionLink再次调用控制器。这就是问题所在。该控制器中有一些来自TempData存储库的信息。如果我调用它并将其为null,则该页面将无法正确重新加载。有更好的方法吗?
-
@DmainEvent,这恰恰是TempData的问题之一。用F5刷新页面。可能是PITA。我个人从不使用TempData。如果我需要保留某些东西以便它必须能够在页面刷新后继续存在,则可以将其保留在后端,以便在给定其唯一标识符的情况下始终可以在需要时对其进行检索。 TempData实际上应该用于寿命很短的对象存储机制:例如通知消息之类的东西。
-
您如何将其存储在后端?像数据库一样,或者您是否使用某种机制(例如会话)?
-
@DmainEvent,当我说后端时,这实际上可能意味着任何集中存储位置,允许稍后再检索此信息。这将取决于我的应用程序的特定要求。范围从客户端上的cookie,服务器上的文件,通过NoSQL键/值对存储到关系数据库。会议对我来说是不可能的。我讨厌它,从不使用它。
-
我感到你很痛苦。我鄙视会议。嗯:我可能需要做一个重大的重新设计。
-
这就是我的问题所在。我试图在控制器之间获取XML。尝试运行我的网站时,出现此异常。无效的URI:Uri字符串太长。
-
@DmainEvent,也许您可??以提出一个新问题,显示您的确切代码,解释您的问题,...