在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--怎么从控制器向视图传递数据的更多相关文章

  1. .NET MVC控制器向视图传递数据的四种方式

    .NET MVC控制器向视图传递数据的四种方式: 1.ViewBag  ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...

  2. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  3. MVC学习系列9--控制器接收从视图传递过来的参数

    前面学习了,从控制器向视图传递数据,现在学习怎么从视图向控制器传递数据. 通常,我们有两种方式,来处理浏览器的请求,一个是GET方式,一个是POST方式.一般来说,直接通过在浏览器中输入URL话,请求 ...

  4. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  5. ASP.NET MVC学习系列(二)-WebAPI请求(转)

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  6. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  7. ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  8. MVC学习系列——ModelBinder扩展

    在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POS ...

  9. MVC学习系列——记一次失败面试后,感想。

    在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...

随机推荐

  1. 图的广度优先搜索(BFS)

    把以前写过的图的广度优先搜索分享给大家(C语言版) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 ...

  2. [c++] Smart Pointers

    内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...

  3. Full Gc经历分析

    背景: 个别机器:内存突然上升,cpu利用率升高. 解决过程 1. jmap dump整个内存镜像 2. 整个文件700多M,使用Jhat打不开 3. 换heapanalyzer,能打开,但没有分析出 ...

  4. 正则匹配抓取input 隐藏输入项和 <td>标签内的内容

    这里不多作解释了,只要提供方法,如果想了解正则匹配,就去百度. 第一条是,匹配出所有的隐藏输入域 $patern = "/<input(.*?)type=\"hidden\& ...

  5. ZOJ Problem Set - 1392 The Hardest Problem Ever

    放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...

  6. 【LeetCode】House Robber III(337)

    1. Description The thief has found himself a new place for his thievery again. There is only one ent ...

  7. 让你的web程序“动”起来。

    看到这里你可能会问,asp.net程序本身就是动态网站,还要如何动? 我这里所谓的动起来,是指动态加载,动态更新.好吧可能你又要问了动态网站本来就是动态加载,动态更新的.asp.net的程序依附于II ...

  8. 自己封装的Windows7 64位旗舰版,微软官网上下载的Windows7原版镜像制作,绝对纯净版

    MSDN官网上下载的Windows7 64位 旗舰版原版镜像制作,绝对纯净版,无任何精简,不捆绑任何第三方软件.浏览器插件,不含任何木马.病毒等. 集成: 1.Office2010 2.DirectX ...

  9. 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误

    本文转载自: http://www.cnblogs.com/JiaoWoWeiZai/p/5892255.html 最近DotNetCore更新到了1.0.1,Azure tools也更新到了2.9. ...

  10. visual studio 2015 开发android

    转载请注明: http://www.cnblogs.com/sunyl/p/5493249.html http://www.cnblogs.com/sunyl/ 最近有不少新闻, 甲骨文向谷歌索赔93 ...