TempData未被清除

时间:2011-10-03 02:57:05

标签: c# asp.net-mvc asp.net-mvc-3 tempdata

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

这是流程:

  1. 使用提交表单。
  2. 代码(特殊操作过滤器)将模型添加到TempData,重定向到登录页面。
  3. 用户重定向回GET操作,该操作读取TempData并直接调用POST操作
  4. 在第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
    }
    

    我发现this article表示:

    1. 只有在标记为要删除的情况下,才会在请求结束时从TempData中删除项目。
    2. 只有在阅读时才会标记要删除的项目。
    3. 通过调用TempData.Keep(键)可以取消标记项目。
    4. RedirectResult和RedirectToRouteResult始终调用TempData.Keep()。
    5. 通过TempData["xxx"]阅读它并不是“读”,因此它们应该被标记为删除?

      最后一个关注我 - 因为我在POST后做了重定向(P-R-G)。但这是无法避免的。

      有没有办法可以说“弃这个项目”。 TempData.Remove?或者我这样做错了吗?

3 个答案:

答案 0 :(得分:10)

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

对此并不高兴。我认为TempData的重点是我没有必须这样做。

也可以直接使用Session。

答案 1 :(得分:7)

这里涉及2个GET HTTP请求:

  1. 第一个请求由客户端发送,并且是将某些内容存储到TempData
  2. 中的请求
  3. 在第一个请求结束时,客户端发送第二个HTTP请求以获取登录页面。
  4. 您的方案中没有涉及POST请求。从您的GET Foo操作调用POST Foo操作这一事实并不意味着正在执行单独的请求(您仍处于初始GET请求的上下文中)。它只是一个C#方法调用,而不是一个单独的请求。

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

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

答案 2 :(得分:3)

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

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

2)临时数据不会总是删除已访问的项目。它仅在动作导致Http 200状态代码(ViewResult / JsonResult / ContentResult等)时删除该项目。

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