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 内のアイテムが削除されないことが保証されます。2 番目のオーバーロードは、TempData 内の特定の項目を保持するために使用できます。

そのため、TempData 値に自動的にフラグが立てられているようです。これらの値が TempData 内の _initialKeys の下に表示されることを確認して、これを確認しました。

于 2010-10-20T21:51:38.910 に答える