TempData未被清除

RPM*_*984 9 c# asp.net-mvc tempdata asp.net-mvc-3

我正在开发一个ASP.NET MVC 3 Web应用程序,我在其中使用TempData来存储模型对象,在用户未登录的场景中.

这是流程:

  1. 使用提交表单.
  2. 代码(特殊操作过滤器)将模型添加到TempData,重定向到登录页面.
  3. 用户重定向回GET操作,该操作读取TempData并直接调用POST操作

在第3步之后,我会想到TempData会被清除吗?

这是代码:

[HttpGet]
public ActionResult Foo()
{
    var prefilled = TempData["xxxx"] as MyModel;
    if (prefilled != null)
    {
       return Foo(prefilled);
    }
}

[HttpPost]
[StatefulAuthorize] // handles the tempdata storage and redirect to logon page
public ActionResult Foo(MyModel model)
{
   // saves to db.. etc
}
Run Code Online (Sandbox Code Playgroud)

我发现这篇文章指出:

  1. 只有在标记为删除时,才会在请求结束时从TempData中删除项目.
  2. 只有在阅读时才会标记要删除的项目.
  3. 通过调用TempData.Keep(key)可以取消标记项目.
  4. RedirectResult和RedirectToRouteResult始终调用TempData.Keep().

读它TempData["xxx"]不是一个"读",因此它们应被标记为删除?

最后一个关注我 - 因为我在POST(PRG)后进行重定向.但这是无法避免的.

有没有办法说"弃这个项目".TempData.Remove?或者我这样做错了吗?

RPM*_*984 11

通过TempData.Remove在我阅读后立即添加来修复.

对此并不高兴.我认为重点TempData是我没有必要这样做.

也可以直接使用Session.


Dar*_*rov 7

这里涉及2个GET HTTP请求:

  1. 第一个请求由客户端发送,并且是将某些内容存储到TempData中的请求
  2. 在第一个请求结束时,客户端发送第二个HTTP请求以获取登录页面.

您的方案中没有涉及POST请求.从您的GET Foo操作调用POST Foo操作这一事实并不意味着正在执行单独的请求(您仍处于初始GET请求的上下文中).它只是一个C#方法调用,而不是一个单独的请求.

您在第一个请求期间将某些内容存储到TempData中,并且此TempData将可用于第二个请求.因此,它将在呈现登录页面的控制器操作中可用.

因此,如果要删除TempData,则必须在操作中读取TempData以呈现登录页面.


Kir*_*ula 6

以下是使用Temp数据时要注意的一些关键点。

1)对临时数据的读访问不会立即从字典中删除项目,而只会标记为删除。

2)临时数据不会始终删除已访问的项目。仅当操作导致Http 200状态代码(ViewResult / JsonResult / ContentResult等)时,才删除该项目。

3)在导致Http 302的操作(例如任何重定向操作)的情况下,即使访问数据,数据也会保留在存储中。