我试图整天在控制器之间传递数据,但现在我觉得我还不太了解基础知识。
在整个ASP .NET核心的文档中,他们使用“请求”一词。我假设这是由WebServer的客户端发出的HttpRequest。
还有一些不同的东西应该被绑定到请求的生命周期:
HttpContext
及其HttpContext.Items
字典。AddScoped
的服务。TempData
字典? (不太确定)但是在尝试传递数据时,我发现当我return RedirectToAction(...);
HttpContext
更改HttpContext.GetHashCode()
具有不同的值时),TempData
更改并且通过AddScoped
添加的服务也是新对象。
这表明在RedirectToAction
上发出新请求,再次执行请求管道的所有步骤。我的期望是,RedirectToAction
仅使用不同的控制器操作继续当前请求管道。
我还认为浏览器或任何客户端只提出了一个请求,并在整个过程中得到了一个响应。
那么在控制器动作中调用RedirectToAction
并返回结果时实际发生了什么?
更新
使用TempData工作,但必须首先配置TempDataProvider。例如,将services.AddSingleton<ITempDataProvider,SessionStateTempDataProvider>();
添加到Startup.cs
。谢谢@RonC。
答案 0 :(得分:2)
如前所述,RedirecToAction
会导致浏览器发出新请求,当新请求进入时,它会创建一个全新的HttpContext
。如上所述,要在两个请求之间传递数据,您可以使用查询字符串,会话或cookie。但还有另一种选择需要考虑。
<强> TempData的强>
数据可以通过控制器操作方法中可访问的TempData
集合从一个请求传递到另一个请求。 TempData
集合专门用于将数据从一个请求传递到另一个请求。 TempData
的美妙之处在于放置在TempData
中的对象的生命周期恰好是一个额外的请求。因此,请求1中的TempData
中的任何内容都将存在于请求2中,但在请求2结束时会自动从TempData
中删除。这使得TempData
非常适合从一个请求传递数据另一个不必在查询字符串中披露该信息,或者可能在会话中忘记它并使会话对象膨胀。
答案 1 :(得分:1)
保存当前请求的状态是不可能的,因为...... HTTP是无状态的。每个RedirectToAction
都会告诉浏览器发出另一个HTTP请求。正如documentation所说。
返回对浏览器的HTTP 302响应,这会导致浏览器向指定的操作发出GET请求。
如果您想在HTTP请求之间传递一些数据,则必须使用cookie或会话机制。