您的位置:首页 > 编程语言 > ASP

ASP.NET MVC 传值方法ViewData与ViewBag的区别

2016-07-14 08:41 721 查看

一、介绍

在Asp.net MVC 3 web应用程序中,我们会用到ViewDataViewBag,对比一下:

ViewDataViewBag
它是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、在Controllers中设置值

1 public ActionResult Index()
2         {
3             ViewBag.name = "webapi";        //设置值
4             ViewData["name"] = "webapi";    //设置值
5             return View();
6         }


2、在Views中获取值

1 @{
2     ViewBag.Title = "asp.net mvc";
3 }
4 <h2>测试</h2>
5
6 @ViewBag.name
7
8 @ViewData["name"]


三、对比

通过定义我们可以看出ViewBag 是ViewData的动态封装器,相当于在ViewData的基础上进行了封装处理

ViewData与ViewBag的区别

1、ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value,ViewData["myName"]
2、ViewBag是动态类型,使用时直接添加属性赋值即可ViewBag.myName
3、ViewBag和ViewData只在当前Action中有效,等同于View
4、ViewData和ViewBag中的值可以互相访问,因为ViewBag的实现中包含了ViewData

注意:

1,只有当要访问的关键字是一个有效的C#标识符时,ViewBag 才起作用。
例如,如果在ViewData["Key With Spaces"]中存放一个值,那么就不能使用ViewBag访问。因为这样根本就无法通过编译。
2,动态值不能作为一个参数传递给扩展方法。因为C#编译器为了选择正确的扩展方法,在编译时必须知道每一个参数的真正类型。如果其中任何一个参数是动态的,那么就不会通过编译。
例如,这行代码就会编译失败:@Html.TextBox("name",ViewBag.Name)。要使这行代码通过编译有两种方法:第一是使用ViewData["Name"],第二是把ViewBag.Name值转换为一个具体的型:(string)ViewBag.Name
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: