9

我正在开发一个 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
}

我发现这篇文章指出:

  1. 如果项目已被标记为删除,则仅在请求结束时从 TempData 中删除项目。
  2. 项目仅在阅读时被标记为删除。
  3. 通过调用 TempData.Keep(key) 可以取消标记项目。
  4. RedirectResult 和 RedirectToRouteResult 总是调用 TempData.Keep()。

那么通过阅读它TempData["xxx"]不是“阅读”,因此应该将它们标记为删除?

最后一个让我有点担心——因为我在 POST (PRG) 之后进行了重定向。但这无法避免。

有没有办法我可以说“放弃这个项目”。临时数据。删除?还是我做错了?

4

4 回答 4

12

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

对此不是很高兴。我认为重点TempData是我不必这样做。

还不如直接使用Session。

于 2011-10-03T03:05:17.330 回答
7

这里涉及 2 个 GET HTTP 请求:

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

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

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

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

于 2011-10-03T06:02:44.723 回答
7

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

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

2) Temp data will not always remove the item that has been accessed. It only removes the item when an action results in an Http 200 status code (ViewResult/JsonResult/ContentResult etc).

3) In case of actions that result in an Http 302 (such as any redirect actions), the data is retained in storage even when it is accessed.

于 2015-05-16T01:22:59.947 回答
0

That's not the way to clear it off. You could have pretty much used Session instead of TempData. Only advantage with TempData is that it manages the data by itself.

As I had answered earlier, Value is only cleared when the Action results in a 200 (Such as ViewResult/ContentResult/JsonResult) in all other scenarios, precisely any actions resulting Http Status code of 302(such as RedirectAction )will retain the data in TempData.

Read through the following for more details

ASP.NET TempData isn't cleared even after reading it

于 2015-09-14T18:40:56.057 回答