我正在开发一个ASP.NET MVC 3 Web应用程序,我在其中使用TempData存储模型对象,在用户未登录的情况下。
这是流程:
在第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表示:
通过TempData["xxx"]
阅读它并不是“读”,因此它们应该被标记为删除?
最后一个关注我 - 因为我在POST后做了重定向(P-R-G)。但这是无法避免的。
有没有办法可以说“弃这个项目”。 TempData.Remove?或者我这样做错了吗?
答案 0 :(得分:10)
通过在我阅读后立即添加TempData.Remove
来修复。
对此并不高兴。我认为TempData
的重点是我没有必须这样做。
也可以直接使用Session。
答案 1 :(得分:7)
这里涉及2个GET HTTP请求:
您的方案中没有涉及POST请求。从您的GET Foo操作调用POST Foo操作这一事实并不意味着正在执行单独的请求(您仍处于初始GET请求的上下文中)。它只是一个C#方法调用,而不是一个单独的请求。
您在第一次请求期间将某些内容存储到TempData中,此TempData将可用于第二个请求。因此,它将在呈现登录页面的控制器操作中可用。
因此,如果要删除TempData,则必须在操作中读取TempData以呈现登录页面。
答案 2 :(得分:3)
以下是使用临时数据时需要注意的一些要点。
1)对临时数据的读访问不会立即从字典中删除项目,而只会删除标记。
2)临时数据不会总是删除已访问的项目。它仅在动作导致Http 200状态代码(ViewResult / JsonResult / ContentResult等)时删除该项目。
3)如果导致Http 302的操作(例如任何重定向操作),即使访问数据,数据也会保留在存储中。