ViewBag 和 ViewData 的传值

简介:在 ASP.NET MVC 中,页面间和 Controller 与View之间主要有以下几种小量数据传值方式,ViewData、 ViewBag、TempData、Session 变量。 我们是幸运的,微软提供给了我们这么多传值方法,但选择越多越让人抓狂,这些技术每一种都有自己的优点和缺点,现在主要说明ViewData、 ViewBag的用法与区别?
一、ViewData:
(1)ViewData 是一个继承自 ViewDataDictionary 类的 Dictionary 对象。
(2)ViewData 用来从 Controller 向对应的 View 传递值。
(3)ViewData 的只在当前当前的请求中有效,生命周期和 View 相同,其值不能在多个请求中共享。
(4)在重定向(redirection)后,ViewData 中存储的变量值将变为 null。
(5)在取出 ViewData 中的变量值是,必须进行合适的类型转换(隐式或显式)和空值检查。
通过简单的例子,演示一下如何使用 ViewData 来从 Controller 向 View 传值
public ActionResult Login()
{
//返回数据到页面
ViewData[“Message”] = “This is a message from ViewData”;
return View();
}
然后,我们从视图中取出这个变量

执行后,你将会在浏览器中看到如下的结果,

注意:使用ViewData时,需要进行类型转换。ViewData 适合从 Controller 向 View 传递简单对象数据 时使用。
二、ViewBag:
(1)ViewBag是一个动态类型变量(dynamic),这是 C# 4.0引入的新特性,变量类型会在运行时进行解析。
(2)ViewBag 基本上是 ViewData 的包装,也是用来从 Controller 向 View 来传递值的。
(3)ViewBag 也只在当前的请求中有效。
(4)在重定向(redirection)后,ViewBag 中存储的变量值将变为 null
(5)因为 ViewBag 是动态类型,所以我们在取得其值时,不需要进行类型转换。
同样,通过一个简单的例子来演示一下如何利用 ViewBag 从 Controller 向 View 传递数据
public ActionResult Login()
{
//返回数据到页面
ViewBag .Message = “This is a message from ViewData”;
return View();
}
然后,我们从视图中取出这个变量

最后,执行程序,你将会在浏览器中看到如下结果,

由于ViewBag不需要进行类型转换,所以ViewBag 更适合从 Controller 向 View 传递复杂对象数据时使用, 因为取出存储在其中的数据变量时无需进行类型转换。

三、单表查询和多表查询查出的变量也可以给ViewData 和 ViewBag进行赋值。其实和上面两个例子大 致是想相同的,所以我就用再ViewBag为例演示,给下拉框查询出数据。
public ActionResult Index()
{
List<S_Class> listClass = (from tabClass in myModel.S_Class
select tabClass).ToList();
//返回数据到页面
ViewBag.listClass = listClass;
return View();
}
然后,我们在视图中循环取出这个变量

最后,执行程序,你将会在浏览器中看到如下结果,

在ViewData和ViewBag使用那个更好,在理论上ViewData比ViewBag的性能更好,但是ViewData需要进行数据的转换,ViewBag则不需要进行类型转换。在用户使用时性能方面的影响是非常小的。所以推荐使用ViewBag 从 Controller 向 View 传递数据。(这是本人观点)

四、ViewBag 和 ViewData 的区别
虽说用 ViewBag 来代替 ViewData 使用着更快捷,但是相对于 ViewData 来说,ViewBag 还是有一些不能用的地方:
1.ViewBag 要访问的必须是一个有效的标识符,否则无效。比如:ViewData[“Query Income”]
就不能使用 ViewBag 来访问。因为“Query Income”中有无效的 C#标识符 空格。
2.动态值不能作为一个参数传递给扩展方法。因为 C#为了选择正确的扩展方法规定必须标
明每一个参数的类型。如果参数中有任何一个参数是动态的就无法通过编译。比如:
@Html.TextBox(“Name”,ViewBag.Name)就会编译失败。
解决方法:
① 将 ViewBag.Name 替换为 ViewData[“Name”];
② 把 ViewBag.Name 替换为一个具体类型的参数:(string)ViewBag.Name;

五、总结
ViewData 和 ViewBag 其实是一回事, ViewBag 其实是对 ViewData 的封装,其内部其实是使用 ViewData 实现数据存储的。唯一的不同点是,ViewBag 可以存储动态类型(dynamic)的变量值,而 ViewData 只能存储 String Key/Object Value 字典数组。也就是说 ViewData[“Name”]和 ViewBag.Name 是一样的效果。

ViewBag 和 ViewData 的传值相关推荐

  1. ViewBag与ViewData传值乱码问题解决方案

    ViewBag与ViewData传值乱码问题解决方案 参考文章: (1)ViewBag与ViewData传值乱码问题解决方案 (2)https://www.cnblogs.com/mi21/p/121 ...

  2. ViewBag 和 ViewData 的用法和区别

    所谓的ViewBag是asp.net mvc3 中对ViewData 的 一种动态封装,用法更方便.它赋值的方法:ViewBag.Name = "jack":其实ViewBag[& ...

  3. ViewBag、ViewData和TempData使用方法、区别与联系

    一.区别与联系 ViewData 和 TempData 都可以传递弱类型数据,区别如下:TempData 只在当前 Action 中有效,生命周期和 View 相同:保存在Session中,Contr ...

  4. ViewBag和ViewData的用法和区别

    ViewBag和ViewData的用法和区别 作者:欧日鑫 撰写时间:2020年8月8日 一.ViewBag的定义 public dynamic ViewBag {get {if (_dynamicV ...

  5. viewBag和viewData区别

    viewBag和viewData区别 viewData: 它是key/value字典集合 从Asp.net mvc1 就有了 基于Asp.net3.5 framework ViwData比ViewBa ...

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

    一.介绍 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类 ...

  7. MVC ViewData和ViewBag

    视图数据可以通过ViewBag属性访问,它主要是为了从Controller到view进行传值用的,类似有所使用的ViewData[] 字典类.对于ViewBag是如此的强大,意味着你能动态的set/g ...

  8. ViewData、ViewBag和 TempData

    ViewData.ViewBag和 TempData 首先这三个对象都是在mvc中传递数据的. ViewData的声明和调用(写法) //声明ViewData["www"] = & ...

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

    在做MVC开发时经常会用到ViewData和ViewBag进行传值操作,因为很常用所以在这里总结一下,以方便后来人. Album.cs: [csharp] view plain copy using  ...

最新文章

  1. 使用SQLServer 2008的CDC功能实现数据变更捕获
  2. 每句话都可以品半辈子!!!
  3. Linux的DNS配置2-主从服务器
  4. 【Spark Summit East 2017】BigDL:Spark上的分布式深度学习库
  5. Mysql 批量插入数据的方法
  6. rtsp服务器搭建_如何从“零”开始搭建直播平台
  7. CSS实现的阴影效果
  8. TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
  9. 马斯克又要搞事情,不锈钢材质的Space X“星际飞船”正式亮相
  10. 最大流,最小费用最大流:解析 + 各种板子
  11. linux 索引,Linux学习笔记-索引类命令
  12. Oracle 同音字查询,汉字的演变过程100字,汉字的演变图片
  13. win10支持8t 硬盘_WIN8.1/ WIN10磁盘分区详解
  14. Python3 使用psycopg2模块 批量写入数据到PostgreSQL数据库(最强输出速度,单机数据库3000W数据写入最多180秒)
  15. AOJ-AHU-OJ-675 定位赛
  16. LGG7刷入第三方ROM,安卓11
  17. 数字乡村建设浅谈(一):可行性、难点、思考
  18. 测试工程师需要具备的能力
  19. _spellmod_leech_aura
  20. word中删除多余的空白页

热门文章

  1. unity 如何检测vr htc vive 头盔是否佩戴
  2. 相机参数标定(camera calibration)及标定结果如何使用
  3. 加强校园智慧消防建设 共谱校园“安全乐章“
  4. 利用CNN实现图像和数值数据融合
  5. Splinter入门(七) Interacting with elements 元素交互(二)
  6. keil利用fromelf.exe生成bin文件
  7. C++下高效率int转成string
  8. 信号与系统 Part 2:傅里叶级数和傅里叶变换(1) 典型周期信号的傅里叶级数推导
  9. 高压放大器在介电弹性体材料研究中的应用
  10. AD域服务器搭建指南