Asp.net core mvc NET核心MVC:重定向到操作时请求会发生什么情况

Asp.net core mvc NET核心MVC:重定向到操作时请求会发生什么情况,asp.net-core-mvc,Asp.net Core Mvc,我整天都在试图在控制器之间传递数据,但现在我觉得我还不太了解基本原理 在ASP.NETCore的整个文档中,他们使用了“请求”一词。我假设这是由Web服务器的客户端生成的HttpRequest 在请求的生命周期中还应该绑定不同的内容: HttpContext及其HttpContext.Items字典 通过依赖项注入使用AddScoped添加的服务 TempData字典?(对此不太确定) 但是当我试图传递数据时,我观察到当我返回RedirectToAction(…)HttpContext更改(

我整天都在试图在控制器之间传递数据,但现在我觉得我还不太了解基本原理

在ASP.NETCore的整个文档中,他们使用了“请求”一词。我假设这是由Web服务器的客户端生成的HttpRequest

在请求的生命周期中还应该绑定不同的内容:

  • HttpContext
    及其
    HttpContext.Items
    字典
  • 通过依赖项注入使用
    AddScoped
    添加的服务
  • TempData
    字典?(对此不太确定)
但是当我试图传递数据时,我观察到当我返回RedirectToAction(…)HttpContext更改(
HttpContext.GetHashCode()
具有不同的值),
TempData
更改和通过
AddScoped
添加的服务也是新对象


这意味着在
redirectoaction
上会发出一个新的请求,再次执行请求管道的所有步骤。不过,我的期望是
重定向到操作
仅使用不同的控制器操作继续当前请求管道

我还认为浏览器或任何客户端在整个过程中只发出一个请求并得到一个响应


那么,在控制器操作中调用
RedirectToAction
并返回结果时,实际发生了什么

更新:
使用TempData是可行的,但必须首先配置TempDataProvider。例如add
services.AddSingleton()
Startup.cs
。谢谢@RonC。

无法保存当前请求的状态,因为。。。HTTP是无状态的。每个
RedirectToAction
都会告诉浏览器发出另一个HTTP请求。正如我所说的

向浏览器返回HTTP 302响应,这会导致浏览器对指定操作发出GET请求


如果您想在HTTP请求之间传递一些数据,则必须使用cookie或会话机制。

如前所述,
重定向操作将导致浏览器发出新请求,当新请求出现时,它将创建一个全新的
HttpContext
。如前所述,要在两个请求之间传递数据,可以使用查询字符串、会话或cookie。但是还有另一个选择要考虑。

TempData

数据可以通过控制器操作方法中可访问的
TempData
集合从一个请求传递到另一个请求。
TempData
集合是专门为将数据从一个请求传递到另一个请求而设计的。
TempData
的美妙之处在于,放置在
TempData
中的对象的生存期正好是一个额外的请求。因此,请求1中放置在
TempData
中的任何内容都将出现在请求2中,但在请求2结束时会自动从
TempData
中删除。这使得
TempData
非常适合将数据从一个请求传递到另一个请求,而不必在查询字符串中透露该信息,也不必在会话中忘记该信息,从而使会话对象膨胀。

重定向到操作
还允许您通过
routeValue
@Jasen而不是路由来传递查询字符串上的数据值只是用于模型绑定的值(据我所知)。我想我必须序列化我的对象并将其存储在会话中。似乎没有.NET Core版本的RedirectToAction的文档,但它似乎以相同的方式工作。是的,您不会通过查询字符串传递对象,但可以说,传递项id,然后在以下操作中查找id。@FSMaxB它必须以相同的方式工作,因为这种行为是由HTTP性质引起的:-)我实际上试图使用TempData进行此操作,但它没有工作。但是我读到一些关于内容在第一次访问时被删除的信息,这可能是问题所在吗?此外,我在“IActionFilter”的实现中访问了它,而不是在控制器操作本身中。我还没有使用操作过滤器,但如果在第一次访问时将其删除(这有点道理),这很可能是您的问题。因此,您可能应该尝试一下,在action方法的下一个请求中访问它,而不必首先在action筛选器中访问它。如果确实需要在操作筛选器中访问它,则可以将其重新添加到临时数据或添加到请求项集合。所以它对action方法可用。不,TempData不保留我的数据,即使我只访问一次。您设置了会话支持吗?TempData通常使用会话。现在在.Net Core 1.1中也有一个基于cookie的TempData提供程序。您需要启用其中一个,以便TempData正常工作。谢谢。现在它起作用了。我已注册会话,但未注册SessionStateTempDataProvider。我认为这是一个糟糕的设计,在未配置TempDataProvider的情况下尝试使用TempData时应该引发异常。