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