zoukankan      html  css  js  c++  java
  • 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!";
    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

        生命周期:

     

  • 相关阅读:
    C语言中指针*p[N], (*P)[N],及**p的区别
    一个酷炫的,基于HTML5,Jquery和Css的全屏焦点图特效,兼容各种浏览器
    day10函数作业详解
    day9函数作业详解
    day7计算作业详解
    day6作业详解
    通过Web安全工具Burp suite找出网站中的XSS漏洞实战(二)
    使用Docker快速部署ELK分析Nginx日志实践(二)
    java 字符串转运算符
    生成给定范围的n随机整数
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/9749066.html
Copyright © 2011-2022 走看看