TempData未被清除

我正在使用ASP.NET MVC 3 Web应用程序,在那里我使用TempData存储模型对象,在用户未登录的情况下。

流程如下:

  • 使用提交表单。
  • 代码(特殊操作过滤器)将模型添加到TempData,重定向到登录页面。
  • 用户重定向回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
    }
    

    我发现这篇文章说:

  • 如果项目已被标记为删除,则只能在请求结束时从TempData中删除项目。
  • 项目只有在阅读时才被标记为删除。
  • 可以通过调用TempData.Keep(key)来标记项目。
  • RedirectResult和RedirectToRouteResult总是调用TempData.Keep()。
  • 那么通过TempData["xxx"]阅读它不是一个“阅读”,因此他们应该被标记为删除?

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

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


    通过在读取它之后添加TempData.Remove修复。

    对此并不满意。 我想整点TempData是,我没有做到这一点。

    也可以直接使用Session。


    这里涉及2个GET HTTP请求:

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

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

    因此,如果您想要删除TempData,则必须从TempData读取登录页面的操作。


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

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

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

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

    链接地址: http://www.djcxy.com/p/74429.html

    上一篇: TempData Not Being Cleared

    下一篇: TempData are always empty