簡 介html
在前面的章節中,咱們已經很清楚,MVC工做模型的流程,Controller中的Action接收到客戶端的請求,處理後要將數據返回給View,那麼Action中是如何將數據返回給View的,兩者之間打通的橋樑又是什麼呢?前端
這些問題正是本章節須要解決的,下面先複習一下MVC的請求模型,以下圖:測試
(一). 先解決第一個問題,Action向View中傳值有四種方式:ViewData、ViewBag、TempData、Model,隨意選中一個點擊F12查看源碼,源碼以下:spa
分析:ViewData和TempData分別是ViewDataDictionary類型和TempDataDictionary類型,而這兩種類型均實現了IDictionary接口,因此ViewData和TemData均爲字典類型。3d
咱們再看一下ViewDataDictionary和TempDataDictionary兩個類型源碼,以ViewDataDictionary爲例,代碼以下:code
分析可知賦值方式有兩種: ViewData[" "]=XXX 和 ViewData.Add("key", value) ,TempData賦值方式與此相似。htm
(二). 接下來咱們解決第二個問題,在前端頁面選擇ViewData點擊F12,查看WebViewPage類源碼,源碼以下:這時候,應該都很清楚了。blog
(三). 總結一下結論: 接口
A. ViewData:字典類型,在前端頁面使用的時候,須要進行類型轉換。源碼
B. ViewBag:動態類型,運行時自動進行類型轉換,不須要進行任何類型轉換。
C:Model: 實質就是ViewData.Model,前端頁面經過Model.XXX進行調用,頁面須要using引入程序集。
D:TempData:字典類型,前端頁面使用時候,須要進行類型轉換,但該類型更多的是做爲臨時變量應用於後臺Action直接的傳值,它內部是基於Session實現的,它能夠存儲一次,可是隻能讀取一次,再次使用,將爲空。
1. 測試四種方式向頁面傳值
1 public ActionResult PassValueIndex() 2 { 3 ViewData["num"] = 2; 4 ViewData.Add("num2", 2); 5 6 ViewBag.myNum = 2; 7 TempData["myNum2"] = 2; 8 9 Student stu = new Student() 10 { 11 id="123456", 12 name="ypf", 13 sex="男" 14 }; 15 return View(stu); 16 }
1 @*使用Model賦值,須要引入下面的命名空間*@ 2 @using Ypf.MVC5.Models; 3 @{ 4 Layout = null; 5 } 6 7 <!DOCTYPE html> 8 9 <html> 10 <head> 11 <meta name="viewport" content="width=device-width" /> 12 <title>PassValueIndex</title> 13 </head> 14 <body> 15 <div> 16 <p>Model賦值: 17 @Model.id 18 @Model.name 19 @Model.sex 20 </p> 21 <p>ViewData(須要進行類型轉換):@((int)ViewData["num"]+1) </p> 22 <p>ViewData(須要進行類型轉換):@((int)ViewData["num2"] + 1) </p> 23 24 <p>ViewBag(不須要進行類型轉換):@(ViewBag.myNum+1)</p> 25 <p>TempData(須要進行類型轉換):@((int)TempData["myNum2"]+1)</p> 26 <a href="TestTempData1">第二次調用TempData</a> 27 </div> 28 </body> 29 </html>
2. 測試TempData的時效性
從上面頁面前端代碼中點擊,a標籤,進入下面代碼:
1 public ActionResult TestTempData1() 2 { 3 //第二次次測試使用TempData,由於PassValueIndex頁面已經使用了一次, 4 //因此此處data1爲空,很好的印證了TempData只能調用一次的結論 5 var data1 = TempData["myNum2"]; 6 return Content(""); 7 }
分析發現,這裏的data1爲null,印證了TempData使用一次後清空的結論。