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

15 篇文章 0 订阅
9 篇文章 0 订阅

在做MVC开发时经常会用到ViewData和ViewBag进行传值操作,因为很常用所以在这里总结一下,以方便后来人。

Album.cs:

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.   
  6. namespace WebApplication5.Areas.MyArea.Models  
  7. {  
  8.     public class Album  
  9.     {  
  10.         public string Title { getset; }  
  11.     }    
  12.   
  13. }  


一、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的使用方法

后台代码:

//記得引用命名空間
using WebApplication5.Areas.MyArea.Models;

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;

   //類
   List<Album> alist = new List<Album>();
   alist.Add(new Album { Title="ViewBag ViewData我的第一次傳值!"});
   alist.Add(new Album { Title = "ViewBag ViewData我的第二次傳值!" });
   ViewData["AlbumList"] = alist;

    return View();
}

前台代码: 
后台用ViewData存值,前台既可以通过ViewBag取值,也可以通过ViewData取值。使用ViewData取值时,必须将数据转换成合适的类型;使用ViewBag取值时不需要转换数据类型。

@using WebApplication5.Areas.MyArea.Models;//設置自己類的命名空間
@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]

<ul>  
    @{  
    List<Album> alist = ViewBag.AlbumList as List<Album>;  
    if (alist != null)  
    {  
        foreach (var album in alist)  
        {  
            <li> @album.Title;</li>  
        }  
    }  
}  
</ul>  


三、两者的定义

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

五、简单总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值