第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)
2017-11-27 19:14
633 查看
简 介
在前面的章节中,我们已经很清楚,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. 测试四种方式向页面传值
2. 测试TempData的时效性
从上面页面前端代码中点击,a标签,进入下面代码:
分析发现,这里的data1为null,印证了TempData使用一次后清空的结论。
在前面的章节中,我们已经很清楚,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"] = 2; ViewData.Add("num2", 2); ViewBag.myNum = 2; TempData["myNum2"] = 2; Student stu = new Student() { id="123456", 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使用一次后清空的结论。
相关文章推荐
- EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))
- ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
- MVC到底使用哪种方式传递Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之间取舍
- MVC4.0中ViewBag、ViewData、TempData和ViewModel几种传值方式的区别
- MVC ,Action方法传数据给视图有几种方式?--PS:tempData和Viewbag,还有ViewData之间的区别
- MVC到底使用哪种方式传递Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之间取舍
- MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple
- ASP.Net MVC中 ViewBag, ViewData, TempData, ViewModel 的区别
- ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session
- MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple
- EF5+MVC4系列(12) 在主视图中直接用RenderAction调用子Action,并返回视图(Return View)或者分部视图(Return PartialView); 从主Action传值到子Action使用TempData传值;TempData高级用法
- mvc源码解读(4)-ViewData&ViewBag&TempData&ViewModel
- MVC传递Model之TempData、ViewData、ViewBag差别及用途
- MVC页面常见三种传值方式——ViewData,ViewBag,TempData
- MVC页面常见三种传值方式——ViewData,ViewBag,TempData
- 《MVC》——ViewData、ViewBag、TempData、model
- ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session
- MVC传递Model之TempData、ViewData、ViewBag区别及用途
- MVC3中 ViewBag、ViewData和TempData的使用和区别(不是自己写的)
- MVC:一个View显示多个Model(多个Model你可以使用ViewBag或ViewData , 或者:Model["myInfo"] as)