在做MVC開發時經常會用到ViewData和ViewBag進行傳值操作,因為很常用所以在這裡總結一下,以方便後來人。 一、ViewBag的使用方法
後台代碼:
public ActionResult Index(){ Dictionary<string, string> address = new Dictionary<string, string>(); address.Add("Lng", "12.353535"); address.Add("Lat", "28.262626"); address.Add("Location", "唐寧街十號"); List<string> modules = new List<string>(); modules.Add("Admin module"); modules.Add("Recursive module"); modules.Add("Consistent module"); ViewBag.Name = "蟈蟈"; ViewBag.Age = "18"; ViewBag.Phone = "18233199999"; ViewBag.Address = address; ViewBag.Modules = modules; return View();}
前台代碼:
後台用ViewBag存值,前台既可以通過ViewBag取值,也可以通過ViewData取值。使用ViewData取值時,必須將資料轉換成合適的類型;使用ViewBag取值時不需要轉換資料類型。
@ViewData["Name"]@ViewData["Age"]@ViewData["Phone"]@{ Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;}@if (dict != null){ @dict["Lng"] @dict["Lat"] @dict["Location"]}@{ List<string> list = ViewData["Modules"] as List<string>;}@if (list != null){ @list[0] @list[1] @list[2] }<br/>@ViewBag.Name@ViewBag.Age@ViewBag.Phone@ViewBag.Address@ViewBag.Address["Lng"]@ViewBag.Address["Lat"]@ViewBag.Address["Location"]@ViewBag.Modules@ViewBag.Modules[0]@ViewBag.Modules[1]@ViewBag.Modules[2]
二、ViewData的使用方法
後台代碼:
public ActionResult Index(){ Dictionary<string, string> address = new Dictionary<string, string>(); address.Add("Lng", "12.353535"); address.Add("Lat", "28.262626"); address.Add("Location", "唐寧街十號"); List<string> modules = new List<string>(); modules.Add("Admin module"); modules.Add("Recursive module"); modules.Add("Consistent module"); ViewData["Name"] = "蟈蟈"; ViewData["Age"] = "18"; ViewData["Phone"] = "18233199999"; ViewData["Address"]=address; ViewData["Modules"] = modules; return View();}
前台代碼:
後台用ViewData存值,前台既可以通過ViewBag取值,也可以通過ViewData取值。使用ViewData取值時,必須將資料轉換成合適的類型;使用ViewBag取值時不需要轉換資料類型。
@ViewData["Name"]@ViewData["Age"]@ViewData["Phone"]@{ Dictionary<string, string> dict = ViewData["Address"] as Dictionary<string, string>;}@if (dict != null){ @dict["Lng"] @dict["Lat"] @dict["Location"]}@{ List<string> list = ViewData["Modules"] as List<string>;}@if (list != null){ @list[0] @list[1] @list[2] }<br/>@ViewBag.Name@ViewBag.Age@ViewBag.Phone@ViewBag.Address@ViewBag.Address["Lng"]@ViewBag.Address["Lat"]@ViewBag.Address["Location"]@ViewBag.Modules@ViewBag.Modules[0]@ViewBag.Modules[1]@ViewBag.Modules[2]
三、兩者的定義
ViewBag的定義:
public dynamic ViewBag { get { if (_dynamicViewData == null) { _dynamicViewData = new DynamicViewDataDictionary(() => ViewData); } return _dynamicViewData; } }
ViewData的定義:
public ViewDataDictionary ViewData { get { if (_viewData == null) { SetViewData(new ViewDataDictionary()); } return _viewData; } set { SetViewData(value); } }
通過定義我們可以看出ViewBag是ViewData的動態封裝器,相當於在ViewData的基礎上進行了封裝處理。 四、兩者的區別 ViewData是字典類型,賦值方式用字典方式,通過key值讀取對應的value,ViewData[“myName”] ViewBag是動態類型,使用時直接通過屬性賦值即可,ViewBag.myName ViewData和ViewBag只在當前Action中有效,等同於View
ViewData和ViewBag中的值可以互相訪問
注意:
1、只有當關鍵字是有效C#標識符時,ViewBag才起作用。
例如:如果在ViewData[“Key With Space”]中存放一個值,那麼就不能使用ViewBag訪問,因為這樣根本無法通過編譯。
2、動態值不能作為一個參數傳遞給擴充方法,因為C#編譯器為了選擇正確的擴充方法,在編譯時間必須知道每一個參數的真正類型。如果其中任何一個參數是動態,那麼就不會通過編譯。
例如:@Html.TextBox(“name”,ViewBag.Name) 就會編譯失敗。
要使這行代碼通過編譯有兩種方法: @Html.TextBox(“name”,(string)ViewBag.Name) 、@Html.TextBox(“name”,ViewData[“Name”]) 五、簡單總結
遇到未知的東西不要著急,現在每天有那麼多新知識面世,沒有人能記住所有的知識點,只要能靜下心來認真研究總能學會的,一定要相信自己能行,不要對自己設限。