4

在 ASP.NET MVC 2 中,TempData值会一直存在,直到会话结束或被读取。用微软的话...

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.

谁能提供任何指针来帮助我更好地理解TempDataASP.NET MVC 2 中的持久性是怎么回事?

4

1 回答 1

11

我要把这个扔出去...

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

根据这个可能过时的博客条目......

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

从操作方法中调用 Keep() 可确保在当前请求结束时不会删除 TempData 中的任何项目,即使它们已被读取。第二个重载可用于保留 TempData 中的特定项目。

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

于 2010-10-20T21:51:38.910 回答