第三节: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使用一次后清空的结论。
第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)的更多相关文章
- EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))
一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...
- MVC中控制器向视图传值的四种方式
MVC中的控制器向视图传值有四种方式分别是 1 ViewDate 2.ViewBag 3.TempDate 4.Model 下面分别介绍四种传值方式 首先先显示出控制器中的代码 using S ...
- MVC教程四:Controller向View传值的几种方式
一.通过ViewData传值 MVC从开始版本就一直支持使用ViewData将Controller里面的数据传递到View.ViewData定义如下: 从上面的截图中可以看出,ViewData里面存的 ...
- ASP.NET MVC Controller向View传值的几种方式
上几篇博文提到MVC和WebForm的区别,主要是MVC的Controller和View将传统的WebForm的窗体和后台代码做了解耦,这篇博文简单介绍一下在MVC中Controller向View是如 ...
- .NET MVC控制器向视图传递数据的四种方式
.NET MVC控制器向视图传递数据的四种方式: 1.ViewBag ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...
- Action中取得request,session的四种方式
Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...
- ASP.NET MVC之下拉框绑定四种方式(十)
前言 上两节我们讲了文件上传的问题,关于这个上传的问题还未结束,我也在花时间做做分割大文件处理以及显示进度的问题,到时完成的话再发表,为了不耽误学习MVC其他内容的计划,我们今天开始好好讲讲关于MVC ...
- Spring事务管理的四种方式(以银行转账为例)
Spring事务管理的四种方式(以银行转账为例) 一.事务的作用 将若干的数据库操作作为一个整体控制,一起成功或一起失败. 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不 ...
- UI的线程问题:单线程原因及更新UI的四种方式
1.UI线程为什么设计为单线程? UI控件的操作不是线程安全的,对于多线程并发访问的时候,如果使用加锁机制会导致: UI控件的操作变得很复杂. 加锁的操作必定会导致效率下降. 所以android系统在 ...
随机推荐
- chome(谷歌浏览器)上传文件崩溃/上传图片崩溃/打开浏览文件未响应 解决方案
测试解决方案:关闭搜狗输入法(我用的是搜狗输入法,若使用其他输入法,此方案也可能适用),再测试是否重现浏览器崩溃问题 可选解决方案:升级搜狗输入法(如果想 卸载输入法 也可以) 前面有段时间chome ...
- 让 Windows7 - 64bit 支持 VC++ 6.0 的解决方法(无法启动此程序,因为计算机中丢失 MSVCRTD.dll。尝试重新安装该程序以解决此问题)
源地址:https://www.cnblogs.com/poissonnotes/p/4372136.html 无法启动此程序,因为计算机中丢失 MSVCRTD.dll.尝试重新安装该程序以解决此问题 ...
- 复制命令(ROBOCOPY)
ROBOCOPY 命令: // 描述: 相比较 xcopy.copy 来说,复制的功能就强大很多, xcopy.copy 是单线程的,robocopy是多线程的,但是和一些专业的复制软件相比速度还是 ...
- LeetCode算法题-Array Partition I(Java实现)
这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...
- “软到不行”的WWDC2018
转载请标明来源:https://www.cnblogs.com/zhanggui/p/9154542.html 简介 一年一度的WWDC于北京时间6月5号凌晨1点在加利福利亚州圣何塞的麦克恩利会议中心 ...
- 【转】Android调用Sqlite数据库时自动生成db-journal文件的原因
数据库为了更好实现数据的安全性,一半都会有一个Log文件方便数据库出现意外时进行恢复操作等.Sqlite虽然是一个单文件数据库,但麻雀虽小五脏俱全,它也会有相应的安全机制存在 这个journal文件便 ...
- 如何在Jupyter里以不同的运行模式使用Pyspark
假设你的环境已经安装好了以下东西,如何详细的安装它们不在本文的讨论范围之内 具体的可疑参考三分钟搞定jupyter和pyspark整合 anaconda2 findspark pyspark 这里多说 ...
- 基于 HTML5 的工业互联网云平台监控机房 U 位
前言 机柜 U 位管理是一项突破性创新技术--继承了 RFID 标签(电子标签)的优点的同时,完全解决了 RFID 技术(非接触式的自动识别技术)在机房 U 位资产监控场应用景中的四大缺陷,采用工业互 ...
- Django缓存机制--rest_framework中节流源码使用的就是django提供的缓存api
一.配置缓存 https://www.jb51.net/article/124434.htm 二.缓存全站.页面.局部 三.自我控制的简单缓存API API 接口为:django.core.c ...
- 家庭记账本小程序之删(java web基础版四)
实现删除消费账单 1.main_left.jsp中该部分,调用Servlet中delete方法 2.Servlet中delete方法,调用Dao层list方法,跳转到del.jsp页面 3.Dao层l ...