2017-08-21 8 views
0

私は本のコードでASP.net MVC5を学んでいます。Asp.Net mvc 5 tempdataが動作しません

public ActionResult DemoTempData() 
{ 
    ViewData["Msg1"] = "From ViewData Message."; 
    ViewBag.Msg2 = "From ViewBag Message."; 
    TempData["Msg3"] = "From TempData Message."; 
    return RedirectToAction("Redirect1"); 
} 

public ActionResult Redirect1() 
{ 
    TempData["Msg4"] = TempData["Msg3"]; 
    return RedirectToAction("GetRedirectData"); 
} 

public ActionResult GetRedirectData() 
{ 
    return View(); 
} 

GetRedirectDataビュー:

@{ 
    ViewBag.Title = "GetRedirectData"; 
} 

<h2>GetRedirectData</h2> 
<ul> 
    <li>ViewData-Msg1:@ViewData["Msg1"]</li> 
    <li>ViewBag-Msg2:@ViewBag.Msg2</li> 
    <li>TempData-Msg3:@TempData["Msg3"]</li> 
    <li>TempData-Msg4:@TempData["Msg4"]</li> 
</ul> 

私はViewDataViewBagが値を渡さないことを知っています。 Msg3Msg4には値が必要ですが、表示されません。 Redirect1()の値を確認すると、Msg3nullであることがわかります。
私は何が起こっているかと非常に混同しています。

+2

'@TempData [」提供されていますMsg3 "]'には値はありません( 'TempData'は1つの要求だけ持続します)。しかし、 '@TempData [" Msg4 "]'は値を持っているはずです - あなたもそれが 'null'ですか? –

答えて

3

ASP.NET MVC TempDataは、セッション状態のコンテンツを格納します。したがって、TempDataは後続のHTTPリクエストで使用された直後に破棄されます。

あなたの場合、TempData ["Msg3"]をTempData ["Msg4"]に割り当てています。だからあなたがTempData ["Msg3"]からコンテンツを消費すると、それは破壊されます。したがって、TempData ["Msg3"]にアクセスしようとするたびに、null値が返されます。

ピークおよびメソッドを使用すると、破棄されずに値を読み取ることができます。

参照:コントローラで

https://msdn.microsoft.com/enus/library/system.web.mvc.tempdatadictionary.peek(v=vs.118).aspx

object value = TempData["value"]; 

TempData.Keep("value"); 

object value = TempData["value"]; 
-3

組み込みセッション配管を使用して、あなたがそれを破壊するまで、それはあなたと一緒にとどまります。私はそれがいつもうまくいくし、それが簡単だから好きです。それは...

取得するには、実際に使用を節約するために、現在の要求

(例)

System.Web.HttpContext.Current.Session["Msg3"] = StringOfIds; 

ある

System.Web.HttpContext 

string msg3= (string) System.Web.HttpContext.Current.Session["Msg3"]; 
関連する問題