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!";
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 }
生命周期:
以上是关于ViewDataViewBagTempDataSession的区别与联系的主要内容,如果未能解决你的问题,请参考以下文章