Asp.net MVC中ViewData與ViewBag的使用方法

changuncle發表於2017-09-03

在做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的基礎上進行了封裝處理。

四、兩者的區別

  1. ViewData是字典型別,賦值方式用字典方式,通過key值讀取對應的value,ViewData[“myName”]
  2. ViewBag是動態型別,使用時直接通過屬性賦值即可,ViewBag.myName
  3. ViewData和ViewBag只在當前Action中有效,等同於View
  4. 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”])

五、簡單總結

遇到未知的東西不要著急,現在每天有那麼多新知識面世,沒有人能記住所有的知識點,只要能靜下心來認真研究總能學會的,一定要相信自己能行,不要對自己設限。

相關文章