第三節:Action向View傳值的四種方式(ViewData、ViewBag、TempData、Model)


 簡  介

   在前面的章節中,我們已經很清楚,MVC工作模型的流程,Controller中的Action接收到客戶端的請求,處理后要將數據返回給View,那么Action中是如何將數據返回給View的,二者之間打通的橋梁又是什么呢?

  這些問題正是本章節需要解決的,下面先復習一下MVC的請求模型,如下圖:

  

 (一). 先解決第一個問題,Action向View中傳值有四種方式:ViewData、ViewBag、TempData、Model,隨意選中一個點擊F12查看源碼,源碼如下:

  分析:ViewData和TempData分別是ViewDataDictionary類型和TempDataDictionary類型,而這兩種類型均實現了IDictionary接口,所以ViewData和TemData均為字典類型。

  我們再看一下ViewDataDictionary和TempDataDictionary兩個類型源碼,以ViewDataDictionary為例,代碼如下:

  分析可知賦值方式有兩種: ViewData[" "]=XXX   和  ViewData.Add("key", value) ,TempData賦值方式與此類似。

   (二). 接下來我們解決第二個問題,在前端頁面選擇ViewData點擊F12,查看WebViewPage類源碼,源碼如下:這時候,應該都很清楚了。

   

   (三). 總結一下結論:   

  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使用一次后清空的結論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM