ViewBag 和 ViewData 的传值-程序员宅基地

技术标签: JavaScript  javascript  

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 是一样的效果。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_50179223/article/details/108076776

智能推荐

uniapp app中导出手机号码到通讯录_uniapp 导出通讯录-程序员宅基地

文章浏览阅读1.1k次。uniapp app中导出手机号码到通讯录 var that = this plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (addressbook) => { console.info('获取通信录对象成功') // console.info(addressbook) plus.contacts.getAddressBook(plus_uniapp 导出通讯录

【网络安全】-- 我眼中的物联网蜜罐-程序员宅基地

文章浏览阅读3.2k次。物联网蜜罐1、蜜罐1.1 定义蜜罐是一类没有实际业务用途的网络安全资源,本质是一种对攻击方进行欺骗的技术。1.2 作用价值是吸引攻击者对它进行非法使用, 从而帮助网络安全研究人员发现、捕获和分析攻击行为。相比于入侵检测、防火墙等被动防护手段,蜜罐能够部署运行和捕获攻击数据,2、物联网蜜罐指以物联网计算、网络、感知及执行等资源为诱饵, 用于发现、捕获和分析物联网安全威胁的一种网络欺骗技术。物联网终端设备存在的安全威胁:缺乏身份认证使用默认配置固件不更新网络安全性薄弱2.1 构成_物联网蜜罐

职场人必学的Python自动化测试框架有哪些?_oython搭建自动化框架用到的库-程序员宅基地

文章浏览阅读570次。职场人必学的Python自动化测试框架有哪些?常用的Python自动化测试框架有Robot Framework、Pytest、UnitTest/PyUnit、Behave、Lettuce。软件测试的自动化在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。自动化测试以人为驱动的测试行为转化为机器执行的一种过程。实现软件测试自动化用到一些Python自动化测试框架:一、Robot FrameworkRobot Framework主要被用在测试驱动类型的开发与验收中。虽然是由P_oython搭建自动化框架用到的库

Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5_could not calculate build plan: pluginorg.apache.m-程序员宅基地

文章浏览阅读2k次。Eclipse创建maven项目时报错:maven-resources-plugin:2.5 or one of its dependencies could not be resolved_could not calculate build plan: pluginorg.apache.maven.plugins:maven-resourc

设计模式(8)-工厂模式(Factory)_factory_type:8;lens_type:8;-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏3次。【描述】工厂模式有3种类型:简单工厂,工厂方法,抽象工厂。这3种设计模式都属于创建型的设计模式。简单工厂的工厂是具象的,没有抽象的工厂类。工厂方法,定义了一个创建对象的接口,让子类来决定具体实例化哪一个类。抽象工厂模式面对的问题是多产品等级结构的系统设计。相对于简单工厂,工厂方法和抽象工厂都定义了抽象的工厂类。工厂方法与抽象工厂的区别在于:工厂方法的“工厂”只制造单一的“产品”,而抽象工厂可以制造_factory_type:8;lens_type:8;

Jtest首次使用中遇到的问题-程序员宅基地

文章浏览阅读669次。这两天下载了个parasoft jtest 7.5.72自动化测试工具,此版本for eclipse 3.1+jdk1.5,由于jtest是基于eclipse的一个插件,所以用起来比较方便,不过第一次用,在测试时还是遇到一些问题; 1、首先我机子上只有jdk1.6和eclipse3.3,好在安装jtest后自带jdk1.5,eclipse3.1和jtest是集成的,直接可以用了。 2..._jtest无法生成单元测试报告

随便推点

ubuntu之在ubuntu16.04中搭建gitlab服务器_192.168.0.88:8888-程序员宅基地

文章浏览阅读345次。1、安装依赖包sudo apt-get updatesudo apt-get install curl openssh-server ca-certificates postfix注:执行完成后,出现邮件配置,选择Internet那一项(不带Smarthost的)2、添加gitlab 包服务并安装包curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh |._192.168.0.88:8888

【单元测试】Junit5中文文档_junit5官方文档-程序员宅基地

文章浏览阅读978次。一、参考资料junit5UserGuide_zh_cn.md · liushide/junit5_cn_doc - Gitee.comJUnit 5 User Guide_junit5官方文档

Java的23种设计模式---(9)装饰模式_swing包中图形构件 类图-程序员宅基地

文章浏览阅读324次。装饰模式(Decorator)职责:动态的为一个对象增加新的对象。 装饰模式是一种用于替代继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。实现细节:Component抽象构建角色真实对象和装饰对象有相同的接口,这样,客户端对象就能够以真实对象相同的方式同装饰对象交互。ConcreteCompon..._swing包中图形构件 类图

STM32与PID算法_stm32 pid控制算法代码-程序员宅基地

文章浏览阅读2.7w次,点赞36次,收藏259次。一、总体原则 PID调试一般原则 a.在输出不振荡时,增大比例增益P。 b.在输出不振荡时,减小积分时间常数Ti。 c.在输出不振荡时,增大微分时间常数Td。二、各环节作用 [P]比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定_stm32 pid控制算法代码

centos7常见管理命令_grafana- server,service is not a native service, r-程序员宅基地

文章浏览阅读553次,点赞2次,收藏2次。centos常见管理命令,此为视频笔记连接:视频系统命令1,查询运行级别:runlevel 关于运行级别的知识点 0:关机 1:单用户文本模式(密码修复) 2 3:多用户文本模式 4 5:多用户图形模式 6:重启2,切换运行级别:init+级别3,清屏:clear[root@localhost etc]# runlevelN 3[root@localhost etc]# clear---------------..._grafana- server,service is not a native service, redirecting to /sbin/chkcon

微信小程序第三方平台开发【全网发布及全网发布接入检测】_小程序第三方平台接入-程序员宅基地

文章浏览阅读1.5w次。折腾了几个小时,终于通过了全网发布接入检测,进入审核阶段,半个小时之后审核通过。https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&amp;t=resource/res_list&amp;verify=1&amp;id=open1419318611&amp;lang=zh_CN这个是官方链接,不知是我看走眼了,..._小程序第三方平台接入

推荐文章

热门文章

相关标签