第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)
简 介
在前面的章节中,我们已经很清楚,MVC工作模型的流程,Controller中的Action接收到客户端的请求,处理后要将数据返回给View,那么Action中是如何将数据返回给View的,二者之间打通的桥梁又是什么呢?
这些问题正是本章节需要解决的,下面先复习一下MVC的请求模型,如下图:
(一). 先解决第一个问题,Action向View中传值有四种方式:ViewData、ViewBag、TempData、Model,随意选中一个点击F12查看源码,源码如下:
分析:ViewData和TempData分别是ViewDataDictionary类型和TempDataDictionary类型,而这两种类型均实现了IDictionary接口,所以ViewData和TemData均为字典类型。
我们再看一下ViewDataDictionary和TempDataDictionary两个类型源码,以ViewDataDictionary为例,代码如下:
分析可知赋值方式有两种: ViewData[" "]=XXX 和 ViewData.Add("key", value) ,TempData赋值方式与此类似。
(二). 接下来我们解决第二个问题,在前端页面选择ViewData点击F12,查看WebViewPage类源码,源码如下:这时候,应该都很清楚了。
(三). 总结一下结论:
A. ViewData:字典类型,在前端页面使用的时候,需要进行类型转换。
B. ViewBag:动态类型,运行时自动进行类型转换,不需要进行任何类型转换。
C:Model: 实质就是ViewData.Model,前端页面通过Model.XXX进行调用,页面需要using引入程序集。
D:TempData:字典类型,前端页面使用时候,需要进行类型转换,但该类型更多的是作为临时变量应用于后台Action直接的传值,它内部是基于Session实现的,它可以存储一次,但是只能读取一次,再次使用,将为空。
1. 测试四种方式向页面传值
public ActionResult PassValueIndex()
{
ViewData["num"] = ;
ViewData.Add("num2", ); ViewBag.myNum = ;
TempData["myNum2"] = ; Student stu = new Student()
{
id="",
name="ypf",
sex="男"
};
return View(stu);
}
@*使用Model赋值,需要引入下面的命名空间*@
@using Ypf.MVC5.Models;
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>PassValueIndex</title>
</head>
<body>
<div>
<p>Model赋值:
@Model.id
@Model.name
@Model.sex
</p>
<p>ViewData(需要进行类型转换):@((int)ViewData["num"]+1) </p>
<p>ViewData(需要进行类型转换):@((int)ViewData["num2"] + 1) </p> <p>ViewBag(不需要进行类型转换):@(ViewBag.myNum+1)</p>
<p>TempData(需要进行类型转换):@((int)TempData["myNum2"]+1)</p>
<a href="TestTempData1">第二次调用TempData</a>
</div>
</body>
</html>
2. 测试TempData的时效性
从上面页面前端代码中点击,a标签,进入下面代码:
public ActionResult TestTempData1()
{
//第二次次测试使用TempData,因为PassValueIndex页面已经使用了一次,
//所以此处data1为空,很好的印证了TempData只能调用一次的结论
var data1 = TempData["myNum2"];
return Content("");
}
分析发现,这里的data1为null,印证了TempData使用一次后清空的结论。
最新文章
- Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.
- ASP.NET MVC Razor
- AOPR破解的密码复制的方法
- Atom.io设置ctrl+delete
- Angular JS 学习之简介
- asp.net EF model中的默认值设置
- Java 8 vs. Scala(一): Lambda表达式
- 张孝祥Java高新技术汇总
- What is Observer and Observable and when we used these?
- nyoj 鸡兔同笼
- mysql备份和bin-log日志
- Spring框架第一天
- 在Eclipse下配置算法(第四版)运行环境
- Hamburger
- 用python处理文本,本地文件系统以及使用数据库的知识基础
- linux:正则表达式grep命令
- 一维码Code 39简介及其解码实现(zxing-cpp)
- In-band Network Function Telemetry
- Code Forces 18D Seller Bob(简单DP)
- python常用命令—终端安装win32的两种方法
热门文章
- 能ping通虚拟机,但snmp报文 Destination unreachable(Host administratively prohibited
- echarts柱状图点击阴影部分触发事件
- qemu 系列
- ElasticSearch(八):elasticsearch.yml配置说明
- SQL ALTER TABLE 语句
- Vue 自定义一个插件的用法、小案例及在项目中的应用
- iBATIS 传MAP处理方式(value是list的方式)
- [LeetCode] 3. 无重复字符的最长子串
- 理解MySQL数据库事务
- 路由信息对象Route之属性query和params的区别