1. 程式人生 > >MVC中傳遞資料的方式:ViewData、ViewBag、TempData、model

MVC中傳遞資料的方式:ViewData、ViewBag、TempData、model

在學習MVC的過程中,Controller裡面向View傳遞資料很重要,我們在Controller裡面講資料加工以後,傳遞給View,然後讓View將資料在瀏覽器上顯示出來,這樣我們就能在瀏覽器上看見了,但是從Controller向View中傳遞資料的方式有很多,包括ViewData、ViewBag、TempData、Model等等前面三個都是以弱型別的方式傳遞資料,最後的一個Model是以強型別的方式傳遞資料。

     我先說一下強型別方式傳遞資料和弱型別傳遞資料方式的區別,這僅僅是我自己的理解,對於ViewData、ViewBag、TempData這哥仨來說,以它三個為載體傳遞資料,不必考慮資料是什麼型別的,它們可以接收很多型別的資料,像String、int、List<>等等,這些型別的資料都可以往上面那“哥三個”裡面裝;而強型別的資料傳遞方式就不同了,如果model的型別是List<String>,那麼這個list裡只能裝String型別的資料,不能裝int或者其它型別的資料。

     1、使用ViewData

     Controller程式碼

ViewData["Name"] = "趙大仙";//傳遞一個字串型別的資料

ViewData["Age"] = 25;//傳遞一個int型別的資料

ViewData["Time"] = DateTime.Now;

List<String> list = new List<string>();

list.Add("字串1");

list.Add("字串2");

list.Add("字串3");

ViewData["list1"] = list;//傳遞一個List

檢視中的程式碼
<div>

@ViewData["Name"]

@ViewData["Age"]

</div>

<div>

@ViewData["Time"]

</div>

<ul>

@*使用ViewData傳送過來的資料,在遍歷的時候需要強制轉化一下資料型別*@

@foreach (var item in ViewBag.list1)

{

<li>

@item

</li>

}

</ul>


     2、使用ViewBag

     Controller中的程式碼

ViewBag.Name = "趙大仙";//傳遞一個字串型別的資料

ViewBag.Age = 25;//傳遞一個int型別的資料

ViewBag.Time = System.DateTime.Now;

List<String> list = new List<string>();

list.Add("字串1");

list.Add("字串2");

list.Add("字串3");

ViewBag.list1 = list;//傳遞一個List </span>
 檢視中的程式碼 
<div>

@ViewBag.Name

@ViewBag.Age

</div>

<div>

@ViewBag.Time

</div>

<ul>

@*使用ViewData傳送過來的資料,在遍歷的時候需要強制轉化一下資料型別*@

@foreach (var item in ViewBag.list1)

{

<li>

@item

</li>

}

</ul>
ViewData與ViewBag的比較
ViewData ViewBag
View是Key/Value字典集合 它是Dynamic型別物件
ViewData在ASP.NET MVC 1就有的 ViewBag在ASP.NET MVC 3才有的
基於ASP.NET 3.5 Framework 基於ASP.NET 4.0 與 .NET  Framwork
ViewData比ViewBag快 ViewBag比ViewData慢
在ViewPage查詢資料的時候需要轉換為合適的資料型別 在ViewPage查詢資料的時候不需要轉換為合適的資料型別
有一些型別轉換程式碼 可讀性好

 

     
    3、使用TempData

    TempData用來:在一次請求中,同時執行多個Action方法時,在多個Action之間共享資料使用。

    主檢視的Action程式碼

public ActionResult Index()

{

TempData["Ms1"] = "那誰...";

return View();

}
主檢視程式碼
<body>

     @*請求PartView方法*@

     @{Html.RenderAction("PartView");}

</body>

  部分檢視Action程式碼

public ActionResult PartView()

{

    ViewData["Ms2"] = TempData["Ms1"] + "借我點錢!";
    
    return PartialView();

}
部分檢視程式碼
<table>

    <tr>

        <td>@ViewData["Ms2"]</td>

    </tr>

</table>

    

    4、利用model傳遞資料

 

    Action中的程式碼

public ActionResult Index()

{

    List<String> list = new List<string>();
    
    list.Add("字串1");

    list.Add("字串2");

    list.Add("字串3");

    return View(list);

}

  檢視中的程式碼

@model List<String>

@{
    Layout = null;
 }


<!DOCTYPE html>
<html>

  <head>
        <title>Index</title>
  </head>

  <body>
     <div>
        @Html.TextBoxFor(a=>a[0])
     </div>

     <div>
       @Html.TextBoxFor(a=>a[1])
     </div>

    @Html.TextBoxFor(a=>a[2])
  </body>

</html>
 

     5、小結
    上面便是我在學習MVC過程中總結的由Controller向View傳遞資料的方式,這幾種方式各有各的優勢和特點,我們應該根據情況用,ViewData雖然傳遞資料快,但是相比較ViewBag它的可讀性不好,而且ViewBag在ViewPage查詢資料的時候不需要轉換為合適的資料型別;可是ViewBag與ViewData在不同的Action請求中不能傳遞資料,這時候TempData就出來了;至於Model型別的,特別適合實體型別,比如說由資料庫中的表對映成的實體,在View中繫結實體後,就可以隨心所欲的將實體中的屬性利用Lamda表示式加載出來了。

轉自:https://blog.csdn.net/zhoukun1008/article/details/50541380