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

来源:互联网 发布:淘宝买gtx1080截图 编辑:程序博客网 时间:2024/05/16 18:47

在做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”])

五、简单总结

遇到未知的东西不要着急,现在每天有那么多新知识面世,没有人能记住所有的知识点,只要能静下心来认真研究总能学会的,一定要相信自己能行,不要对自己设限。

原创粉丝点击