TempData сохраняется после чтения в ASP.NET MVC 2 - PullRequest
3 голосов
/ 21 октября 2010

В ASP.NET MVC 2 значения TempData сохраняются до завершения сеанса или до тех пор, пока они не будут прочитаны.В словах Microsoft ...

Значение 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.

Может кто-нибудь предоставить какие-либо указатели, чтобы помочь мне лучше понять, что происходитс TempData постоянство в ASP.NET MVC 2?

1 Ответ

10 голосов
/ 21 октября 2010

Я собираюсь выбросить это там ...

RedirectToAction имеет тип возврата RedirectToRouteResult.Это вызывается несколькими методами действия в приведенном выше псевдокоде.

Согласно этой возможно устаревшей записи в блоге ...

4.RedirectResult иRedirectToRouteResult всегда вызывает TempData.Keep ()

и

Вызов Keep () из метода действия гарантирует, что ни один из элементов в TempData не будет удален в концетекущий запрос, даже если они были прочитаны.Вторая перегрузка может использоваться для сохранения определенных элементов в TempData.

Так что, похоже, мои значения TempData автоматически помечаются.Я убедился в этом, увидев, что эти значения отображаются в _initialKeys в TempData.

...