MVC中的ViewData、ViewBag和TempData

一、ViewBag和ViewData的定义

[csharp]  view plain  copy
  1. public dynamic ViewBag { get; }  
  2. public ViewDataDictionary ViewData { getset; }  


二、ViewBag和ViewData的区别

viewdataviewbag
它是key/value字典集合它是dynamic类型对象
从asp.net mvc1就有了从asp.netmvc3才有
基于asp.netframework 3.5基于asp.net framework4.0
viewdata比viewbag快viewbag比viewdata慢
页面查询数据时需要转换合适的类型在页面查询数据时不需要转换合适的类型
有一些类型转换代码可读性较好

ViewBag不再是字典的键值对结构,而是dynamic动态类型,它会在程序运行的时候动态解析。


[csharp]  view plain  copy
  1. ViewBag.NumberObjs = new string[] { "one""two""three" };  
  2.             ViewData["NumberArrs"] = new string[] { "one""two""three" };  
  3.   
  4.             //正确,dynamic类型的解析作用,foreach可以使用  
  5.             foreach (var item in ViewBag.NumberObjs)  
  6.             {  
  7.   
  8.             }  
  9.   
  10.             //错误:foreach语句不可作用于object类型对象上  
  11.             foreach (var item in ViewData["NumberArrs"])  
  12.             {  
  13.   
  14.             }  


1、ViewBag其实本质就是ViewData,只是多了层Dynamic控制。所以,使用何种方式完全取决于你的个人爱好。

2、ViewBag和ViewData仅针对当前Action中有效,生命周期和view相同


三、TempData

      保存在session中,Controller每次执行请求时,会从session中获取tempdata,而后清空session,获取完tempdata数据,虽然保存在内部字典中。但是字典中每个条目访问一次后就从字典中删除。因此Tempdata数据最多只能经过一次controller传递,并且每个元素最多只能访问一次,之后删除


四、举例


在Controller中使用ViewData:
[csharp]  view plain  copy
  1. <pre name="code" class="csharp">public ActionResult UsingViewData()  
  2.         {  
  3.             ViewData["Title"] = "Using ViewData";  
  4.             ViewData["ProjectName"] = "My Test Project";  
  5.             ViewData["ProjectDescription"] = "This is TestProject to demo Viewdata and viewbag details";  
  6.             ViewData["StartDate"] = new DateTime(2011, 1, 1);  
  7.             ViewData["TotalPrice"] = 1000;  
  8.             ViewData["TotalDays"] = 100;  
  9.             Dictionary<stringstring> stackholder = new Dictionary<stringstring>();  
  10.             stackholder.Add("Client""Mr.Client");  
  11.             stackholder.Add("Manager","Mr.Joy");  
  12.             stackholder.Add("Team Leader","Mr.Toy");  
  13.             stackholder.Add("Sr.developer","Mr.dojoy");  
  14.             stackholder.Add("developer","Mr.nodoy");  
  15.             ViewData["stackholder"]=stackholder;  
  16.   
  17.             List<string>modules =new List<string>();  
  18.             modules.Add("Admin module");  
  19.             modules.Add("ShoppingCart module");  
  20.             modules.Add("CMS module");  
  21.             ViewData["modules"]=modules;  
  22.             return View();  
  23.         }  

 
[csharp]  view plain  copy
  1. <div><span style="color: rgb(35, 35, 35); font-family: Verdana, Arial, helvetica, sans-seriff; font-size: 14px; line-height: 25px; orphans: 2; text-align: -webkit-auto; widows: 2;">对应UsingViewData View的cshtml:</span></div><pre name="code" class="html">@{  
  2.     ViewBag.Title = "UsingViewData";  
  3. }  
  4.   
  5. <h1>@ViewData["Title"]</h1>  
  6.  <div>  
  7.    <div>  
  8.     <h2>Project Name : @ViewData["ProjectName"]</h2>  
  9.    </div>  
  10.    <div>  
  11.      ProjectDescription :     
  12.      <p>"@ViewData["ProjectDescription"]".</p>  
  13.    </div>  
  14.    <div>  
  15.       Stack Holder :  
  16.       <br />  
  17.   
  18.       <ul id="stakholder">  
  19.       @foreach ( var stakerholder in ViewData["stackholder"as Dictionary<stringstring> )  
  20.       {            
  21.     <li>  
  22.         @stakerholder.Key   : @stakerholder.Value  
  23.     </li>  
  24.       }  
  25.      </ul>  
  26.    </div>  
  27.    <div>  
  28.      Project Details:<br />  
  29.      <div>  
  30.        module List  :  
  31.        <ul id="modulelist">  
  32.       @foreach ( var module in ViewData["modules"as List<string> )  
  33.       {            
  34.     <li>  
  35.         @module  
  36.     </li>  
  37.       }  
  38.      </ul>  
  39.           
  40.      </div>  
  41.      Project StartDate : @ViewData["StartDate"]  <br />  
  42.      Project TotalPrice: @ViewData["TotalPrice"] <br />  
  43.      Project TotaDays  : @ViewData["TotalDays"]   
  44.    </div>  
  45.  </div>  
[csharp]  view plain  copy
  1.   

ViewBag controller:

[csharp]  view plain  copy
  1. public ActionResult UsingViewBag()  
  2. {  
  3.     ViewBag.Title = "Using ViewBag";  
  4.     ViewBag.ProjectName = "My Test Project";  
  5.     ViewBag.ProjectDescription = "This is Test Project to demo Viewdata and viewbag details";  
  6.     ViewBag.StartDate = new DateTime(2011, 1, 1);  
  7.     ViewBag.TotalPrice = 1000;  
  8.     ViewBag.TotalDays = 100;  
  9.     Dictionary<stringstring> stackholder = new Dictionary<stringstring>();  
  10.     stackholder.Add("Client""Mr.Client");  
  11.     stackholder.Add("Manager""Mr.Joy");  
  12.     stackholder.Add("Team Leader""Mr.Toy");  
  13.     stackholder.Add("Sr.developer""Mr.doyjoy");  
  14.     stackholder.Add("developer""Mr.nodoy");  
  15.     ViewBag.stackholder = stackholder;  
  16.   
  17.     List<string> modules = new List<string>();  
  18.     modules.Add("Admin module");  
  19.     modules.Add("ShoppingCart module");  
  20.     modules.Add("CMS module");  
  21.     ViewBag.modules = modules;  
  22.     return View();  
  23. }  

对应的页面:

[html]  view plain  copy
  1. @{  
  2.     ViewBag.Title = "UsingViewBag";  
  3. }  
  4.   
  5. <h1>@ViewBag.Title</h1>  
  6.  <div>  
  7.    <div>  
  8.     <h2>Project Name : @ViewBag.ProjectName</h2>  
  9.    </div>  
  10.    <div>  
  11.      ProjectDescription :     
  12.      <p>"@ViewBag.ProjectDescription.</p>  
  13.    </div>  
  14.    <div>  
  15.       Stack Holder :  
  16.       <br />  
  17.   
  18.       <ul id="stakholder">  
  19.       @foreach ( var stakerholder in ViewBag.stackholder )  
  20.       {            
  21.     <li>  
  22.         @stakerholder.Key   : @stakerholder.Value  
  23.     </li>  
  24.       }  
  25.      </ul>  
  26.    </div>  
  27.    <div>  
  28.      Project Details:<br />  
  29.      <div>  
  30.        module List  :  
  31.        <ul id="modulelist">  
  32.       @foreach ( var module in ViewBag.modules )  
  33.       {            
  34.     <li>  
  35.         @module  
  36.     </li>  
  37.       }  
  38.      </ul>  
  39.           
  40.      </div>  
  41.      Project StartDate : @ViewBag.StartDate.ToString("dd-MMM-yyyy") <br />  
  42.      Project TotalPrice: @ViewBag.TotalPrice  ₹  <br />  
  43.      Project TotaDays  : @ViewBag.TotalDays   
  44.    </div>  
  45.  </div>  

五、总结


1、ViewDataTempData是字典类型,赋值方式用字典方式,ViewData["myName"] 

2、ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.myName

3、ViewBagViewData只在当前Action中有效,等同于View

4、TempData可以通过转向继续使用,因为它的值保存在Session中。但TempData只能经过一次传递,之后会被系统自动清除

5、ViewDataViewBag中的值可以互相访问,因为ViewBag的实现中包含了ViewData

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍狼_2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值