关于ASP.NET MVC中Controller向View传值用到的两个类对象【ViewData与ViewBag】

最近在开发项目中,使用的是 ASP.NET MVC 由于之前并没有接触,对于它的传值方式有些陌生,在这里进行初步总结积累学习!
1、关于两者的使用:
1-1,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"] = "zhanghm";  
    ViewData["age"]= 23;  
    return View();  
}  
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>  
1-2, ViewBag 使用:
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= "zhanghm";  
    ViewBag.Age = 25;  
    return View();   
}  
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>  
在使用上,我们可以很明显的看出这两种方式的区别,只是存取值得方式有些区别而已!
2、关于两者的定义:
2-1,ViewData定义:
public ViewDataDictionary ViewData {  
    get {  
        if (_viewData == null) {  
            SetViewData(new ViewDataDictionary());  
        }  
        return _viewData;  
    }  
    set {  
        SetViewData(value);  
    }  
}  
2-2,ViewBag定义:
public dynamic ViewBag {  
    get {  
        if (_dynamicViewData == null) {  
            _dynamicViewData = new DynamicViewDataDictionary(() => ViewData);  
        }  
        return _dynamicViewData;  
    }  
}  
通过定义我们可以看出ViewBag 是ViewData的动态封装器,相当于在 ViewData 的基础上进行了封装处理。
3、关于两者的对比:

1、ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value,ViewData["myName"]

2、ViewBag是动态类型,使用时直接添加属性赋值即可ViewBag.myName

3、ViewBag和ViewData只在当前Action中有效,等同于View

4、ViewData和ViewBag中的值可以互相访问,因为ViewBag的实现中包含了ViewData

ViewData ViewBag
它是Key/Value字典集合 它是dynamic类型对像
从Asp.net MVC 1 就有了 ASP.NET MVC3 才有
基于Asp.net 3.5 framework 基于Asp.net 4.0与.net framework
ViewData比ViewBag快 ViewBag比ViewData慢
在ViewPage中查询数据时需要转换合适的类型 在ViewPage中查询数据时不需要类型转换
有一些类型转换代码 可读性更好

注意:
1,只有当要访问的关键字是一个有效的C#标识符时,ViewBag 才起作用。
例如,如果在ViewData["Key With Spaces"]中存放一个值,那么就不能使用ViewBag访问。因为这样根本就无法通过编译。

2,动态值不能作为一个参数传递给扩展方法。因为C#编译器为了选择正确的扩展方法,在编译时必须知道每一个参数的真正类型。如果其中任何一个参数是动态的,那么就不会通过编译。
例如,这行代码就会编译失败:@Html.TextBox("name",ViewBag.Name)。要使这行代码通过编译有两种方法:第一是使用ViewData["Name"],第二是把ViewBag.Name值转换为一个具体的型:(string)ViewBag.Name
4、关于两者的
总结 

对于传值方式这个话题,对于大家来说应该是有些老套,因为只要接触过项目的人都很了解,这是一个非常基础的知识,在这里列出来,主要的目的也不是说要告诉大家如何如何传值,如何如何操作,然后要求大家记下来等,而是要通过上面的知识,告诉大家其实知识并没有我们想的那么高深莫测,所有的知识即使我们没有听说过,但只要我们花一些时间去研究,去总结,那么一切困难都变得easy了!

参考文章: 何静媛





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值