2010-10-20 4 views
3

В значениях ASP.NET MVC 2, TempData значения сохраняются до окончания сеанса или до тех пор, пока они не будут прочитаны. В words of Microsoft ...TempData сохраняется после чтения в ASP.NET MVC 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 при назначении, never уйти, когда я вытащил значение из TempData (даже когда я пришел в другой контроллер).

Единственный способ, с помощью которого я могу уйти, это вручную ударить действие, которое читается с TempData.

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

ответ

10

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

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

В соответствии с этим possibly outdated blog entry ...

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

и

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^