ViewData、ViewBag、TempData、Session的区别与联系

引言:

为尊重原创精神,本文内容全部转自“光头毅”博客(链接地址-->Url)。

在MVC中,Controller与View之间的传值有以下几种方式:

ViewData

ViewBag

TempData

Session

正文:

ViewData和ViewBag其实是一回事,ViewBag其实是对ViewData的封装,其内部其实使用的是ViewData实现数据存储的。唯一不同的是,ViewBag可以存储动态类型(dynamic),而ViewData只能存储string(Key)/Object(value)字典集合。

1 ViewData["Message"]="Hello Word!";
2
3 //Or
4
5 ViewBag.Message="Hello Word!";

TempData也是一个string(Key)/object(value)的字典集合,但是和ViewData、ViewBag不同的是其存储的数据对象的生命周期。如果发生了页面跳转(Redirection),ViewData和ViewBag中的值将不复存在,但是TempData的值依然还存在。换句话讲,ViewBag和ViewData的生命周期只有在从Controller到View中,而TempData的数据不仅在Controller到View中有效,在不同Action或者从一个页面跳转到另一个页面(Controller to Controller)后依然有效。

1 TempData["Message"]="Hello World!";

Session其实和ViewData类型,也是一个string(Key)/object(value)的字典集合,但是Session只存储在客户端的Cookies中,所以它的生命周期是最长的,但是也正是因为其存储在客户端,所有一些敏感的机密信息是不能存储在里面的。

ViewData:

特点:

1.ViewData是一个继承于ViewDataDictionary类的Dictionary对象。

2.ViewData用来从Controller向对应的View传值。

3.ViewData只有在当前请求中有效,生命周期与View相同,其值不能在多个请求中共享。

4.在重定向后(Redirection),ViewData存储的值变为null

5.在取出ViewData的变量值,必须进行合适的类型转换和空值检查

例子:

<html>
    <head>
        <meta name="view-port" content="width=device-wodth"/>
        <title>Index</Index>
    </head>

    <body>
        <div>
            @ViewData["Message"].ToString()
        </div>
     </body>
</html>

Controller Code:

1 public ActionResult Index()
2 {
3     ViewData["Message"]="Hello World!";
4     return View();
5 }

效果:

注意:在从ViewData中取出变量Message时没有对其中进行类型转换,因为我们存储的是简单类型,如果是负责类型,必须进行类型转换。

ViewBag:

特点:

1.ViewBag是一个动态类型变量(dynamic),变量类型在运行时会进行解析。

2.ViewBag其他跟ViewData差不多。

3.ViewBag是动态类型,所以在取值时,不需要进行类型转换。

例子:

1 public ActionResult Index()
2 {
3     ViewBag.Message = "This is a message from ViewBag";
4
5     return View();
6 }

在浏览器中浏览时,如下图:

TempData:

特点:

1.TempData是一个继承TempDataDictionary的字典集合对象,它默认情况是基于Session存储机制之上(备注:你也可以让你的TempData基于其他存储机制之上,我们可以提供自定义的ITempDataProvider来完成)

2.TempData用来多个Action 或 从当前请求指向子请求,或者 页面发生了重定向(Redirection)时传递共享数据。

3.只有在目标视图(View)加载完毕后,才能有效。

4.在取出TempData的变量时,需要进行合适的类型转换。

例子:

1     public class Customer
2     {
3         public int ID { get; set; }
4         public string Name { get; set; }
5     }

 1 public ActionResult DisplayCustomer1()
 2 {
 3     Customer customer = new Customer
 4     {
 5         Id = 1001,
 6         Code = "100101",
 7         Amount = 100
 8     };
 9
10     TempData["OneCustomer"] = customer;
11
12     return RedirectToAction("DisplayCustomer2");
13 }
14
15 public ActionResult DisplayCustomer2()
16 {
17     Customer customer = TempData["OneCustomer"] as Customer;
18
19     return View(customer);
20 }

html:

结果:

Session:

特点:

1.Session也是MVC中用来传值的一种方式,但与TempData不同的是,用户的整个会话过程中,Session都不会过期。

2.Session在同一用户会话过程中的所有请求中有效,比如:刷新页面

3.Sessiion的值也需要进行类型转换和检查。

例子:

 1 public ActionResult DisplayCustomer1()
 2 {
 3     Customer customer = new Customer
 4     {
 5         Id = 1001,
 6         Code = "100101",
 7         Amount = 100
 8     };
 9
10     Session["OneCustomer"] = customer;
11
12     return RedirectToAction("DisplayCustomer2");
13 }
14
15 public ActionResult DisplayCustomer2()
16 {
17     Customer customer = Session["OneCustomer"] as Customer;
18
19     return View(customer);
20 }

生命周期:

原文地址:https://www.cnblogs.com/xiaowangzi1987/p/9749066.html

时间: 2024-10-22 09:03:17

ViewData、ViewBag、TempData、Session的区别与联系的相关文章

【MVC4 之 ViewData ViewBag TempData】

ViewData (一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. ViewData.Model:由于viewdata在传入的时候属于弱类型,也就是在ViewData里特定键值的类型永远是object通用对象类型,传给view使用之后,还必须通过转型才能进一步使用,不太方便. eg: public ActionResult Index(){ var data=GetD

MVC页面常见三种传值方式——ViewData,ViewBag,TempData

最近接触MVC代码多了,发现了很多新东西,比如页面传值.发现了MVC里面原来有这么多对象可以用来传值,最近两天用到了ViewData和ViewBag,之后又关联到了TempData,现在列个表格比较下: 用过之后,个人感觉还是ViewBag最好用,直接属性赋值就可以了,但是ViewData和TempData又有它们的优势,在使用的时候,可以根据要传递数据的大小,是从Controller向Views里面传递数据,还是Controller传递数据...综合考虑各种因素再做决定吧. 除了这三种比较常见

ViewData ViewBag TempData

ViewData(一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. ViewData.Model:由于viewdata在传入的时候属于弱类型,也就是在ViewData里特定键值的类型永远是object通用对象类型,传给view使用之后,还必须通过转型才能进一步使用,不太方便. eg: public ActionResult Index(){ var data=GetDa

ViewBag、ViewData和TempData使用方法、区别与联系

一.区别与联系 ViewData 和 TempData 都可以传递弱类型数据,区别如下:TempData 只在当前 Action 中有效,生命周期和 View 相同:保存在Session中,Controller每次执行请求的时候,会从Session中先获取TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删除.因此TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一

MVC3中 ViewBag、ViewData和TempData的使用和区别

在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary).它们的定义如下: public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } 控制器中代码: public ActionResult Index() { Vie

MVC3中 ViewBag、ViewData和TempData的使用和区别(转发:汴蓝)

MVC3中 ViewBag.ViewData和TempData的使用和区别 在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary).它们的定义如下: public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } 控制器

ASP.NET MVC4中ViewBag、ViewData和TempData的使用和区别

一.说明 本文章主要是讲解asp.net mvc中ViewBag.ViewData和TempData的使用和区别,ViewBag.ViewData和TempData常常用于将action方法中的数据传递到view界面. 从MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary). 二.区别 ViewBag 不再是字典的键

MyMvc: TempData ViewData ViewBag

TempData: 创建或更新一次,可访问一次,随即销毁(为是剪切不复制): ViewData: 键值对结构: ViewBag: 使用dynamic控制器,封装ViewData: ViewData与ViewBag异同: 同:一般情况下访问的数据是相同的: 异:1.使用语法:ViewData为字典语法,ViewBag类似属性访问: 2.访问范围:ViewBag不可以访问非有效标识符的ViewData键值对(比如Key带空格): 3.作为参数:因ViewBag使用dynamic,其值为动态类型,而编

Mvc中ViewBag、ViewData、TempData如何使用

对于我初学者来说,Mvc有很多都是我所迷惑的,也是我了解后所痴迷的.废话不多说,来谈谈我今天对Mvc这几个常用的对象的理解吧,这里面只简明概要叙述 ViewBag 获取动态视图数据字典 作用:给视图传递数据,不需要转换类型,由系统动态解析,比ViewData执行性能要差 ViewData   获取或设置视图数据的字典         给视图传递数据,需要转换成相应的类型,编写没有ViewBag方便,可读性强 TempData     临时数据的字典   给控制器或视图传递数据,需要和ViewDa