1. 程式人生 > >MVC Controller向View傳值(ViewData與ViewBag)

MVC Controller向View傳值(ViewData與ViewBag)

擴展方法 time gre 動態 操作 要求 name 由於 讀取

近在開發項目中,使用的是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)