ASP.NET MVC
.NET 4.7.2
C#
SessionのスマートラッパーらしいTempData
…一度値をgetすると削除マークされて現在のリクエストが終了するときに存在が削除される。
という、ちょっと便利なやつ程度の認識でした。
削除マークを付けないように(削除マークを消すのも)
TempData.Keep() ← 全TempData
TempData.Keep(KEY) ← 指定のTempData
を現在のリクエスト内で明示的に呼ぶ
いう。
で、Keep()していないのに?
次のリクエストでもバッチリ居座っている現象が発生。
特定のActionMethodで毎回getで前回と同じ値が取得できてしまう。
結論。
RedirectはKeepしてますね。
RedirectToAction()
Redirect()
スグに試せた対策
TempData.Remove(string key)
スグに消しておく。
いやいや、どっかで再セットしてるだろ → ない
ActionMetho内でgetしているタイミングを変えてみる → 消えない
直前の別ActionMethodでTempDataをgetしてみる → 消える
Keep()していないのに?
どっかでKeep()してないかの視点に立つ。
プログラミングMicrosoft ASP.NET MVC 第3版によると。
データがメモリ内にとどまるのは、現在のリクエストと次のリダイレクトという2つのリクエストの間だけです。
んー。
public ActionResult Index()
{
TempData[TempDataKey] = "TempValue";
return View();
}
public ActionResult About()
{
var result = getTempData(MethodBase.GetCurrentMethod().Name)
System.Diagnostics.Debug.WriteLine(result);
return RedirectToAction("Contact");
// return Redirect("Contact"); // 同じ
}
public ActionResult Contact()
{
var result = getTempData(MethodBase.GetCurrentMethod().Name)
System.Diagnostics.Debug.WriteLine(result);
return View();
}
Index → About →(Redirect)→ Contact
About Get!:TempValue
Contact Get!:TempValue
ContactでTempData取れてるじゃん。
About → Contact
About Empty!
Contact Empty!
TempData消滅。
const string TempDataKey = "TEMP_KEY";
private string getTempData(string actionMethodName)
{
var tempData = TempData[TempDataKey];
if (tempData != null)
{
return ($"{actionMethodName} Get!:{tempData.ToString()}");
}
else
{
return ($"{actionMethodName} Empty!");
}
}
これって当たり前のなのか… どっかにReferenceとかないのかな。
参考文献 プログラミングMicrosoft ASP.NET MVC 第3版 日経BP社 P.273