ViewDataViewBagTempDataSession的区别与联系

Posted xiaowangzi1987

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ViewDataViewBagTempDataSession的区别与联系相关的知识,希望对你有一定的参考价值。

 

    引言:

            为尊重原创精神,本文内容全部转自“光头毅”博客(链接地址-->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!";
View Code

            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!";
View Code

            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>
View Code

            Controller Code:

技术分享图片
1 public ActionResult Index()
2 {
3     ViewData["Message"]="Hello World!";
4     return View();
5 }
View Code

            效果:

                              技术分享图片

            注意:在从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 }
View Code

           技术分享图片

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

                          技术分享图片

    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     }
View Code

 

技术分享图片
 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 }
View Code

 

               

             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 }
View Code

 

    生命周期:

 技术分享图片

 

以上是关于ViewDataViewBagTempDataSession的区别与联系的主要内容,如果未能解决你的问题,请参考以下文章