我目前正在使用MVC5。
想象一下,一个控制器ActionA完成其工作并重定向到另一个控制器ActionB的场景,但也希望第二个方法在其相关视图上显示消息。
如果Controller ActionA设置ViewBag.Message然后调用RedirectToAction,则当ActionB启动时,该Message的值将消失。
在不使用Session的情况下,将消息从一个动作控制器传递到另一个动作控制器的最佳方法是什么?
答案 0 :(得分:5)
您可以使用TempData:
行动A:
TempData["Message"] = "Hi";
行动B:
var message = TempData["Message"];
在操作B中调用getter后,信息将自动从内存中删除。
This article是对ASP.NET MVC中可用的各种持久性技术的一个非常好的解释。
答案 1 :(得分:4)
你说没有会话,但TempData
可能是一个好地方,取决于你传递的内容。它基本上是Session
,只是在您访问该项目后,该项目将从Session
中移除。除非您编写自己的提供程序,否则TempData
实际上默认使用会话。
将其作为选项传递给查询字符串,或将其作为路由中的参数传递(类似于AJ所说的)
除此之外,您已经获得了ASP.NET中提供的标准磨机选项。 HttpContext.Items
或HttpContext.Cache
。但是这两者都在整个应用程序域中共享,因此管理可能会变得棘手。
请记住,网络应该是无国籍的。因此,如果对于该消息非常重要,那么您可能希望以某种方式将其放入URL中(查询字符串或路由),或者使用数据库。
答案 2 :(得分:2)
我会在ActionB的方法签名上加上一个可选参数,例如:
public ActionResult ActionB(string message = "")
请注意,可选参数必须在参数列表中为最后一个。