一.ASP.NET MVC中Controller给View传递数据的方式(ViewData,ViewBag,Model)
ViewData
以ViewData[“name”]=“rupeng”;string s=(string)ViewData[“name”]这样键值对的方式进行数据传送。
ViewBag
ViewBag是dynamic类型的参数,是对ViewData一个动态类型封装,用起来更方便,和ViewData共同操作一个数据。ViewBag.name=""; @ViewBag.name。用ViewBag传递数据非常方便,但是因为ASP.Net MVC中的“Html辅助类”等对于ViewBag有一些特殊约定,一不小心就跳坑了,所以尽量不要用ViewBag,而是使用Model,虽然会麻烦“越麻烦工资越高”
Model
可以在Controller中通过return View(model)赋值,然后在cshtml中通过Model属性来访问这个对象;
如果在cshtml中通过“@model 类型”(注意model小写)指定类型,则cshtml中的Model就是指定的强类型的,这样的cshtml叫“强类型视图”;如果没有指定“@model 类型”, 则cshtml中的Model就是dynamic。
二.ASP.NET MVC 传值方法ViewData与ViewBag的区别
介绍
| 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中查询数据时不需要类型转换 |
| 有一些类型转换代码 | 可读性更好 |
使用说明
- 在Controllers中设置值
public ActionResult Index()
{
ViewBag.name = "webapi"; //设置值
ViewData["name"] = "webapi"; //设置值
return View();
}
- 在Views中获取值
@{
ViewBag.Title = "asp.net mvc";
}
<h2>测试</h2>
@ViewBag.name
@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
浙公网安备 33010602011771号