TempData сохраняется после чтения в ASP.NET MVC 2

В 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?


person Mayo    schedule 20.10.2010    source источник


Ответы (1)


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

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

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

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

и

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

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

person Mayo    schedule 20.10.2010