MVC Controller向View傳值(ViewData與ViewBag)
近在開發項目中,使用的是ASP.NET MVC由於之前並沒有接觸,對於它的傳值方式有些陌生,在這裏進行初步總結積累學習!
一:使用
ViewData使用:
在使用上,我們可以很明顯的看出這兩種方式的區別,只是存取值得方式有些區別而已!
public ActionResult Index()
{
List<string> colors = new List<string>();
colors.Add("red");
colors.Add("green");
colors.Add("blue");
ViewData["listColors"] = colors;
ViewData["dateNow"]= DateTime.Now;
ViewData["name"] = "hejingyuan";
ViewData["age"]= 25;
return View();
}
<p>
My name is <b>@ViewData["name"] </b>,<b>@ViewData["age"] </b>years old.
<br />
I like the following colors:
</p>
<ul id="colors">
@foreach (var color in ViewData["listColors"] as List<string>)
{
<li><font color="@color">@color </font></li>
}
</ul>
<p>
@ViewData["dateNow"]
</p>
public ActionResult Index()
{
List<string>colors = new List<string>();
colors.Add("red");
colors.Add("green");
colors.Add("blue");
ViewBag.ListColors = colors; //colors is List
ViewBag.DateNow= DateTime.Now;
ViewBag.Name= "hejingyuan";
ViewBag.Age = 25;
return View();
}
<p>
My name is <b>@ViewBag.Name</b>, <b>@ViewBag.Age</b> years old.
<br />
I like the following colors:
</p>
<ul id="colors">
@foreach (var color in ViewBag.ListColors)
{
<li><font color="@color">@color</font> </li>
}
</ul>
<p>
@ViewBag.DateNow
</p>
二,定義
通過定義我們可以看出ViewBag 是ViewData的動態封裝器,相當於在ViewData的基礎上進行了封裝處理。
public dynamic ViewBag {
get {
if (_dynamicViewData == null) {
_dynamicViewData = new DynamicViewDataDictionary(() => ViewData);
}
return _dynamicViewData;
}
}
public ViewDataDictionary ViewData {
get {
if (_viewData == null) {
SetViewData(new ViewDataDictionary());
}
return _viewData;
}
set {
SetViewData(value);
}
}
三:對比
ViewData與ViewBag的區別
1、ViewData是字典類型,賦值方式用字典方式,通過key值讀取對應的value,ViewData["myName"]
2、ViewBag是動態類型,使用時直接添加屬性賦值即可ViewBag.myName
3、ViewBag和ViewData只在當前Action中有效,等同於View
4、ViewData和ViewBag中的值可以互相訪問,因為ViewBag的實現中包含了ViewData
註意:
1,只有當要訪問的關鍵字是一個有效的C#標識符時,ViewBag 才起作用。
例如,如果在ViewData["Key With Spaces"]中存放一個值,那麽就不能使用ViewBag訪問。因為這樣根本就無法通過編譯。
2,動態值不能作為一個參數傳遞給擴展方法。因為C#編譯器為了選擇正確的擴展方法,在編譯時必須知道每一個參數的真正類型。如果其中任何一個參數是動態的,那麽就不會通過編譯。
例如,這行代碼就會編譯失敗:@Html.TextBox("name",ViewBag.Name)。要使這行代碼通過編譯有兩種方法:第一是使用ViewData["Name"],第二是把ViewBag.Name值轉換為一個具體的型:(string)ViewBag.Name 。
四:總結
對於傳值方式這個話題,對於大家來說應該是有些老套,因為只要接觸過項目的人都很了解,這是一個非常基礎的知識,在這裏列出來,主要的目的也不是說要告訴大家如何如何傳值,如何如何操作,然後要求大家記下來等,而是要通過上面的知識,告訴大家其實知識並沒有我們想的那麽高深莫測,所有的知識即使我們沒有聽說過,但只要我們花一些時間去研究,去總結,那麽一切困難都變得easy了!
MVC Controller向View傳值(ViewData與ViewBag)