首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TempData未被清除

TempData未被清除
EN

Stack Overflow用户
提问于 2011-10-03 02:57:04
回答 4查看 16K关注 0票数 9

我正在开发一个ASP.NET MVC 3 web应用程序,在这个场景中,我使用TempData存储模型对象,在这个场景中,用户没有登录。

以下是流程:

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

在第三步之后,我会认为TempData会被清除吗?

下面是代码:

代码语言:javascript
复制
[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(键)来取消标记。
  4. RedirectResult和RedirectToRouteResult总是调用TempData.Keep()。

那么,通过使用TempData["xxx"]阅读它,这不是一个“读”,因此,他们应该被标记为删除?

最后一个问题有点让我担心--因为我在投递后做一个重定向( POST )。但这是无法避免的。

有什么办法可以说“扔掉这个东西”吗?TempData.Remove?还是我做错了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-03 03:05:17

修正了在我读完TempData.Remove后添加它。

对此不太高兴。我认为TempData的全部要点是,我不需要这样做。

也可以直接使用会话。

票数 12
EN

Stack Overflow用户

发布于 2011-10-03 06:02:44

这里涉及两个GET HTTP请求:

  1. 第一个请求由客户端发送,是将某些内容存储到TempData中的请求。
  2. 在第一个请求的末尾,客户端发送第二个HTTP请求来获取登录页面。

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

在第一个请求期间,您可以将一些东西存储到TempData中,第二个请求可以使用这个TempData。因此,它将在呈现登录页面的控制器操作中可用。

因此,如果希望删除TempData,则必须在实际操作中从TempData中读取呈现登录页。

票数 7
EN

Stack Overflow用户

发布于 2015-05-16 01:22:59

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

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

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7630678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档