在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. Objective-C精选字符串处理方法

    无论是什么编程语言对字符串的操作是少不了的,对复杂的字符串的分析和操作我们可以用正则表达式来达到我们的目的.简单的字符串处理我们可以借助OC中NSString封装好的字符串处理方法,不过前提是你得了解 ...

  2. Android随笔之——Android ADB详解

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它主要有以下几个功能: 1.运 ...

  3. CRL通用权限控制系统

    此系统能满足一般权限/菜单控制需求,不需要重复开发,达到多系统共用的目的 权限判断是基于请求路径,意味着是页面级控制,可能不符合一些要求,当然你也可以把路径细化实现 菜单为二级菜单,暂不支持多级 此系 ...

  4. DDD 领域驱动设计-“臆想”中的实体和值对象

    其他博文: DDD 领域驱动设计-三个问题思考实体和值对象 DDD 领域驱动设计-三个问题思考实体和值对象(续) 以下内容属于博主"臆想",如有不当,请别当真. 扯淡开始: 诺兰的 ...

  5. DOM 节点的克隆与删除

    无奈的开头 关于DOM节点操作,如果仅仅是根据标准API来操作,那是最简单不过的了.但是现实中却哪有这么容易的问题让我们解决,其实不仅仅是节点的克隆与删除,节点的添加也是如此,而且添加节点需要考虑的情 ...

  6. 6.Struts2简单类型数据的接受

    简单类型数据的接收 在Action类中定义与请求参数同名的属性, 即,要定义该属性的set方法,便能够使struts2自动接收请求参数并赋予同名属性. 简单类型数据的接受举例: 新建工程项目,名称为: ...

  7. solr教程

    转载请注明出处:http://www.cnblogs.com/zhuxiaojie/p/5764680.html 本教程基于solr5.5 前言 至于为什么要用solr5.5,因为最新的6.10,没有 ...

  8. js赋值运算的理解

    简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...

  9. 基于OBS的插件开发总结

    一.介绍 OBS(Open Broadcaster Software)是一个广泛使用的视频录制直播软件.利用该软件可以实现桌面窗口.游戏.网页.RTMP流.图像等的录制直播.OBS也是一个开放源代码的 ...

  10. rsa互通密钥对生成及互通加解密(c#,java,php)

    摘要 在数据安全上rsa起着非常大的作用,特别是数据网络通讯的安全上.当异构系统在数据网络通讯上对安全性有所要求时,rsa将作为其中的一种选择,此时rsa的互通性就显得尤为重要了. 本文参考网络资料, ...