MVC学习系列3--怎么从控制器向视图传递数据


在MVC中,从控制器到视图,传递数据,可以使用 ViewData 和 ViewBag;同样从视图到控制器,传递数据,可以使用Post,QueryString,或者隐藏域;最后从控制器到控制器,传递数据可以使用TempData。
注意:当然,从控制器到视图,传递数据,还可以使用TempData的。
我们来一一看一下:
1.ViewBag方式,从控制器到视图传递数据:
ViewBag is a dynamic property (a new C# 4.0 feature) which means it has no pre-defined properties.ViewBag is a wrapper around the ViewData that exposes the ViewData dictionary as a dynamic object.ViewBag is slower than ViewData and it does not require any type of typecasting for the complex data type.Visual Studio cannot provide IntelliSense support for the dynamic objects, so error is not visible at the design time.
ViewBag是C# 4.0中动态的属性,Viewbag是ViewData的包装,Vewbag比ViewData慢,它不需要对复杂类型进行转换,VS不能对动态类型,提供智能提示,
所以动态对象的错误在编译期间是发现不了的
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now; return View();
}
对应的Index视图:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
当前时间是【ViewBag传递数据】: @ViewBag.TimeNow
</div>
</body>
</html>
结果是:

2.ViewData方式,从控制器到视图,传递数据
ViewData is a dictionary object used to pass data from the controller to view in the form of Key-Value pair.
ViewData is derivative of the ViewDataDictionary class. ViewData is introduced in MVC 1.0.
ViewData requires type casting for complex data types and if redirection occurs, itS value becomes NULL.
ViewData是一个dictionary 对象,用来以键值对的方式,从控制器向视图传递数据,ViewData是ViewDataDictionary 的衍生物,最早是在MVC1.0中引入的,对于复杂类型来说,
ViewData需要类型转换;并且如果在方法中,有redirection【重定向】 出现的话,ViewData里面所包含的数据,就会变成空的。
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
return View();
}
对应的视图:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
当前时间是【ViewBag传递数据】: @ViewBag.TimeNow <br/>
当前时间是【ViewData传递数据】: @ViewData["MyTime"]
</div>
</body>
</html>
结果是:

3.TempData方式,从控制器到视图,传递数据:
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
TempData["TempData"] = DateTime.Now;
return View();
}
对应的视图:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
当前时间是【ViewBag传递数据】: @ViewBag.TimeNow <br/>
当前时间是【ViewData传递数据】: @ViewData["MyTime"]<br/>
当前时间是【TempData传递数据】: @TempData["TempData"]<br />
</div>
</body>
</html>
结果是:

小结:从上面,我们可以看出,ViewBag,ViewData,TempData都可以,从控制器向视图传递数据。
那么,我们就有疑问了,他们三者是不是可以共享数据呢?,我们来验证一下:
我们修改一下,控制器的代码:
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
//ViewData["MyTime"] = DateTime.Now;
//TempData["TempData"] = DateTime.Now;
return View();
}
注释,两行代码,然后视图中:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
当前时间是【ViewBag传递数据】: @ViewBag.TimeNow <br/>
当前时间是【ViewData传递数据】: @ViewData["TimeNow"]<br/>
当前时间是【TempData传递数据】: @TempData["TimeNow"]<br />
</div>
</body>
</html>
结果是:

从上面的图中,可以看到,ViewBag的数据是可以和ViewData共享的,但是不能和TempData共享
那么,ViewData的数据,是否可以和ViewBag,TempData共享呢?我们继续验证一下:
修改控制器的方法:
public ActionResult Index()
{
//ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
//TempData["TempData"] = DateTime.Now;
return View();
}
对应的视图:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
当前时间是【ViewBag传递数据】: @ViewBag.MyTime <br/>
当前时间是【ViewData传递数据】: @ViewData["MyTime"]<br/>
当前时间是【TempData传递数据】: @TempData["MyTime"]<br />
</div>
</body>
</html>
结果是:

可以看出,ViewData和Viewbag也是可以共享数据的,但是ViewBag和VIewData都不能和TempData共享数据
所以阶段性总结一下:
1.ViewData和Viewbag也是可以共享数据的,但是ViewBag和VIewData都不能和TempData共享数据;
2..ViewData和Viewbag还有TempData都是可以从控制器向视图传递数据的。
TempData的作用,还有哪些???
我们来看下:
在控制器中添加一个方法,并且加相应的视图:
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
TempData["TempData"] = DateTime.Now; return View();
} public ActionResult DataVIew()
{
ViewBag.TempView = ViewBag.TimeNow;
ViewData["TempViewDataTime"] = ViewData["MyTime"];
TempData["TempViewData"] = TempData["TempData"];
return View();
}
}
DataView视图:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>DataVIew</title>
</head>
<body>
<div>
当前时间是【ViewBag传递数据】: @ViewBag.TempView <br />
当前时间是【ViewData传递数据】: @ViewData["TempViewDataTime"]<br />
当前时间是【TempData传递数据】: @TempData["TempViewData"]<br />
</div>
</body>
</html>
接着运行DataView页面:

没有传递过来。。。???
我们再修改一下,控制器的方法:
// GET: Home
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
TempData["TempData"] = DateTime.Now; return RedirectToAction("DataVIew");
} public ActionResult DataVIew()
{
ViewBag.TempView = ViewBag.TimeNow;
ViewData["TempViewDataTime"] = ViewData["MyTime"];
TempData["TempViewData"] = TempData["TempData"];
return View();
}
然后,我们运行程序,默认是Index方法,然后因为有,RedirectToAction("DataVIew");,就会跳到DataVIew这个方法中,所以结果是:

可以得出结论:TempData还可以在控制器之间传递数据,而ViewBag和VIewData不能。
最终结论:
1.ViewData和Viewbag也是可以共享数据的,但是ViewBag和VIewData都不能和TempData共享数据;
2..ViewData和Viewbag还有TempData都是可以从控制器向视图传递数据的。
3.TempData还可以在控制器之间传递数据,而ViewBag和VIewData不能。
MVC学习系列3--怎么从控制器向视图传递数据的更多相关文章
- .NET MVC控制器向视图传递数据的四种方式
.NET MVC控制器向视图传递数据的四种方式: 1.ViewBag ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...
- MVC学习系列4--@helper辅助方法和用户自定义HTML方法
在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...
- MVC学习系列9--控制器接收从视图传递过来的参数
前面学习了,从控制器向视图传递数据,现在学习怎么从视图向控制器传递数据. 通常,我们有两种方式,来处理浏览器的请求,一个是GET方式,一个是POST方式.一般来说,直接通过在浏览器中输入URL话,请求 ...
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
- ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- MVC学习系列——ModelBinder扩展
在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POS ...
- MVC学习系列——记一次失败面试后,感想。
在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...
随机推荐
- 重温JSP学习笔记--El函数库
EL函数库(由JSTL提供的) * 导入标签库:<%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/f ...
- 理解HTTP协议
在互联网时代HTTP协议的重要性无需多言,对于技术岗位的同学们来说理解掌握HTTP协议是必须的.本篇博客就从HTTP协议的演进.特性.重要知识点和工作中常见问题的总结等方面进行简单的介绍.理解掌握了这 ...
- Kafka到Hdfs的数据Pipeline整理
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 找时间总结整理了下数据从Kafka到Hdfs的一些pipeline,如下 1> Kafka ...
- RECONFIGURE语句会清空计划缓存么?
几个星期前,有个网友问我一个非常有趣的问题:RECONFIGURE语句会清空计划缓存么?通常我对这个问题的答案是简单的是,但慢慢的我找出了真正的答案是“看情况啦”.我们来看下它,为什么“它看情况”. ...
- 记录visual Studio使用过程中的两个问题
Visual Studio是Windows平台下进行项目管理和开发的终极利器.除了微软自家的技术外,新版的VS不但支持Javascript, Python的开发调试,甚至还支持了Android, iO ...
- JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用
0 ajaxFileUpload简介 ajaxFileUpload插件是一个非常简单的基于Jquery的异步上传文件的插件,使用过程中发现很多与这个同名的,基于原始版本基础之上修改过的插件,文件版本比 ...
- .NET 内存基础(通过内存体验类型、传参、及装箱拆箱)
该随笔受启发于<CLR Via C#(第三版)>第四章4.4运行时的相互联系 一.内存分配的几个区域 1.线程栈 局部变量的值类型 和 局部变量中引用类型的指针(或称引用)会被分配到该区域 ...
- webapi文档描述-swagger
最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员.这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员,最初打算使用word文档方式进行交流 ...
- 尝试加载 Oracle 客户端库时引发 BadImageFormatException
尝试加载 Oracle 客户端库时引发 BadImageFormatException 工程师给计算机诊断,就像医生给病人诊断一样,很多同样的症状,可能是由多种截然不同的原因导致的. 最近进行C# ...
- C#写爬虫,版本V2.0
这个版本主要是以百度图片为对象,对其进行爬虫操作,实现了最基本的下载功能,但是缺陷非常多,日后还会对其进行改进. 打开百度图片,同时打开开发者工具,我们会发现,百度图片是通过如下的一段ajax来加载图 ...