2010-10-20 45 views
3

在ASP.NET MVC 2中,TempData值会一直存在,直到会话结束或直到它们被读取为止。在words of Microsoft ...TempData在ASP.NET MVC 2中读取后仍然存在2

的TempData的值一直保持到 它被读取或直到会话超时 出来。以这种方式持久TempData 启用了重定向等场景,因为TempData中的值是 ,可在单个请求之外使用。

我以为我明白了这一点,但我刚刚在我的应用程序中发现了一个不寻常的行为,其中TempData值可用并且应该不可用。一般情况下,我有一个控制器,其中有一系列操作,其中第一个操作设置值为TempData,接下来的几个操作读取并设置TempData值,最后一个操作读取TempData值。下面的伪代码...

[HttpPost] 
public ActionResult Step1() 
{ 
    TempData["bar"] = foo; 
    return RedirectToAction("Step2"); 
} 

public ActionResult Step2() 
{ 
    var foo = TempData["bar"]; 
    TempData["bar"] = foo; 
    return View(); 
} 

[HttpPost] 
public ActionResult Step2() 
{ 
    var foo = TempData["bar"]; 
    TempData["bar"] = foo; 
    return RedirectToAction("Step3"); 
} 

public ActionResult Step3() 
{ 
    var foo = TempData["bar"]; 
    TempData["bar"] = foo; 
    return View(); 
} 

[HttpPost] 
public ActionResult Step3() 
{ 
    var foo = TempData["bar"]; 
    return RedirectToAction("AnotherAction", "AnotherController"); 
} 

我的看法是,在读取一个值后,它将不再在TempData中可用。但是我开始逐步完成代码,并且在赋值时键/值将被添加到TempData中,但是当我从TempData中提取值(即使当我到达另一个控制器时),它将从不会退出

我能够让它消失的唯一方法是手动点击从TempData读取的操作。

任何人都可以提供任何指针来帮助我更好地理解在ASP.NET MVC 2中持续存在的内容吗?

回答

10

我要扔了这一点那里...

RedirectToAction有RedirectToRouteResult的返回类型。这是由上述伪代码中的几个操作方法调用的。

根据这一possibly outdated blog entry ...

4.RedirectResult和RedirectToRouteResult总是调用 TempData.Keep()

调用从保持()内的动作 方法确保在0123结束时TempData中的项目 都不会被删除目前的请求,即使它们被 读取。可以使用第二次重载 将特定项目保留在TempData中。

所以它看起来像我的TempData值被自动标记。我通过在TempData中的_initialKeys下面看到这些值来验证这一点。