《MVC》——ViewData、ViewBag、TempData、model
2016-01-25 08:40
435 查看
在学习MVC的过程中,Controller里面向View传递数据很重要,我们在Controller里面讲数据加工以后,传递给View,然后让View将数据在浏览器上显示出来,这样我们就能在浏览器上看见了,但是从Controller向View中传递数据的方式有很多,包括ViewData、ViewBag、TempData、Model等等,前面三个都是以弱类型的方式传递数据,最后的一个Model是以强类型的方式传递数据。下面我总结一下在学习的过程中它们传递数据的区别。
我先说一下强类型方式传递数据和弱类型传递数据方式的区别,这仅仅是我自己的理解,对于ViewData、ViewBag、TempData这哥仨来说,以它三个为载体传递数据,不必考虑数据是什么类型的,它们可以接收很多类型的数据,像String、int、List<>等等,这些类型的数据都可以往上面那“哥三个”里面装;而强类型的数据传递方式就不同了,如果model的类型是List<String>,那么这个list里只能装String类型的数据,不能装int或者其它类型的数据。
1、使用ViewData
Controller代码
视图中的代码
2、使用ViewBag
Controller中的代码
视图中的代码
ViewData与View的比较
3、使用TempData
TempData用来:在一次请求中,同时执行多个Action方法时,在多个Action之间共享数据使用。
主视图的Action代码
主视图代码
部分视图Action代码
部分视图代码
4、利用model传递数据
Action中的代码
视图中的代码
5、小结
上面便是我在学习MVC过程中总结的由Controller向View传递数据的方式,这几种方式各有各的优势和特点,我们应该根据情况用,ViewData虽然传递数据快,但是相比较ViewBag它的可读性不好,而且ViewBag在ViewPage查询数据的时候不需要转换为合适的数据类型;可是ViewBag与ViewData在不同的Action请求中不能传递数据,这时候TempData就出来了;至于Model类型的,特别适合实体类型,比如说由数据库中的表映射成的实体,在View中绑定实体后,就可以随心所欲的将实体中的属性利用Lamda表达式加载出来了。
我先说一下强类型方式传递数据和弱类型传递数据方式的区别,这仅仅是我自己的理解,对于ViewData、ViewBag、TempData这哥仨来说,以它三个为载体传递数据,不必考虑数据是什么类型的,它们可以接收很多类型的数据,像String、int、List<>等等,这些类型的数据都可以往上面那“哥三个”里面装;而强类型的数据传递方式就不同了,如果model的类型是List<String>,那么这个list里只能装String类型的数据,不能装int或者其它类型的数据。
1、使用ViewData
Controller代码
ViewData["Name"] = "赵大仙";//传递一个字符串类型的数据 ViewData["Age"] = 25;//传递一个int类型的数据 ViewData["Time"] = DateTime.Now; List<String> list = new List<string>(); list.Add("字符串1"); list.Add("字符串2"); list.Add("字符串3"); ViewData["list1"] = list;//传递一个List
视图中的代码
<div> @ViewData["Name"] @ViewData["Age"] </div> <div> @ViewData["Time"] </div> <ul> @*使用ViewData传送过来的数据,在遍历的时候需要强制转化一下数据类型*@ @foreach (var item in ViewBag.list1) { <li> @item </li> } </ul>
2、使用ViewBag
Controller中的代码
ViewBag.Name = "赵大仙";//传递一个字符串类型的数据 ViewBag.Age = 25;//传递一个int类型的数据 ViewBag.Time = System.DateTime.Now; List<String> list = new List<string>(); list.Add("字符串1"); list.Add("字符串2"); list.Add("字符串3"); ViewBag.list1 = list;//传递一个List </span>
视图中的代码
<div> @ViewBag.Name @ViewBag.Age </div> <div> @ViewBag.Time </div> <ul> @*使用ViewData传送过来的数据,在遍历的时候需要强制转化一下数据类型*@ @foreach (var item in ViewBag.list1) { <li> @item </li> } </ul>
ViewData与View的比较
ViewData | ViewBag |
View是Key/Value字典集合 | 它是Dynamic类型对象 |
ViewData在ASP.NET MVC 1就有的 | ViewBag在ASP.NET MVC 3才有的 |
基于ASP.NET 3.5 Framework | 基于ASP.NET 4.0 与 .NET Framwork |
ViewData比ViewBag快 | ViewBag比ViewData慢 |
在ViewPage查询数据的时候需要转换为合适的数据类型 | 在ViewPage查询数据的时候不需要转换为合适的数据类型 |
有一些类型转换代码 | 可读性好 |
3、使用TempData
TempData用来:在一次请求中,同时执行多个Action方法时,在多个Action之间共享数据使用。
主视图的Action代码
public ActionResult Index() { TempData["Ms1"] = "那谁..."; return View(); }
主视图代码
<body> @*请求PartView方法*@ @{Html.RenderAction("PartView");} </body>
部分视图Action代码
public ActionResult PartView() { ViewData["Ms2"] = TempData["Ms1"] + "借我点钱!"; return PartialView(); }
部分视图代码
<table> <tr> <td>@ViewData["Ms2"]</td> </tr> </table>
4、利用model传递数据
Action中的代码
public ActionResult Index() { List<String> list = new List<string>(); list.Add("字符串1"); list.Add("字符串2"); list.Add("字符串3"); return View(list); }
视图中的代码
@model List<String> @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>Index</title> </head> <body> <div> @Html.TextBoxFor(a=>a[0]) </div> <div> @Html.TextBoxFor(a=>a[1]) </div> @Html.TextBoxFor(a=>a[2]) </body> </html>
5、小结
上面便是我在学习MVC过程中总结的由Controller向View传递数据的方式,这几种方式各有各的优势和特点,我们应该根据情况用,ViewData虽然传递数据快,但是相比较ViewBag它的可读性不好,而且ViewBag在ViewPage查询数据的时候不需要转换为合适的数据类型;可是ViewBag与ViewData在不同的Action请求中不能传递数据,这时候TempData就出来了;至于Model类型的,特别适合实体类型,比如说由数据库中的表映射成的实体,在View中绑定实体后,就可以随心所欲的将实体中的属性利用Lamda表达式加载出来了。
相关文章推荐
- jQuery事件之鼠标事件
- 15年新版DC DataCenter数据中心全套视频教程(存储 UCS Nexus Vsphere)
- CSDN_帖子__WapPc
- 二叉树 代码 早年联系题
- 物联网平台设计心得:你所不知道的CRC校验
- Leetcode 40 - Combination Sum II
- 平衡树的插入
- 深度神经网络主题报告
- 【代码笔记】调用系统震动和声音
- 界面测试注意点
- 【代码笔记】调用系统震动和声音
- UICollectionViewController既有headerView又有footerView。
- 十八年开发经验分享(08)开始学习UML时需要知道的几点建议
- 10个超赞的jQuery图片滑块动画
- JAVA的Socket编程初步
- 排序算法代码 早年练习题 冒泡 归并 快速
- javascript深入理解js闭包
- Codeforces Round #299 (Div. 1) C. Tavas and Pashmaks
- Android LayoutInflater详解
- nest expression & Pyparsing