MVC中的ViewData、ViewBag和TempData


一、ViewBag和ViewData的定義

 

public dynamic ViewBag { get; }  
public ViewDataDictionary ViewData { get; set; }  
public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }

 

二、ViewBag和ViewData的區別

 

viewdata viewbag
它是key/value字典集合 它是dynamic類型對象
從asp.net mvc1就有了 從asp.netmvc3才有
基於asp.netframework 3.5 基於asp.net framework4.0
viewdata比viewbag快 viewbag比viewdata慢
頁面查詢數據時需要轉換合適的類型 在頁面查詢數據時不需要轉換合適的類型
有一些類型轉換代碼 可讀性較好

 

ViewBag不再是字典的鍵值對結構,而是dynamic動態類型,它會在程序運行的時候動態解析。

 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             //錯誤:foreach語句不可作用於object類型對象上  
10            foreach (var item in ViewData["NumberArrs"])  
11             {  
12  
13             }  

  

1、ViewBag其實本質就是ViewData,只是多了層Dynamic控制。所以,使用何種方式完全取決於你的個人愛好。

2、ViewBag和ViewData僅針對當前Action中有效,生命周期和view相同。

三、TempData

      保存在session中,Controller每次執行請求時,會從session中獲取tempdata,而后清空session,獲取完tempdata數據,雖然保存在內部字典中。但是字典中每個條目訪問一次后就從字典中刪除。因此Tempdata數據最多只能經過一次controller傳遞,並且每個元素最多只能訪問一次,之后刪除。

 

四、舉例

在Controller中使用ViewData:

<pre name="code" class="csharp">public ActionResult UsingViewData()
        {
            ViewData["Title"] = "Using ViewData";
            ViewData["ProjectName"] = "My Test Project";
            ViewData["ProjectDescription"] = "This is TestProject to demo Viewdata and viewbag details";
            ViewData["StartDate"] = new DateTime(2011, 1, 1);
            ViewData["TotalPrice"] = 1000;
            ViewData["TotalDays"] = 100;
            Dictionary<string, string> stackholder = new Dictionary<string, string>();
            stackholder.Add("Client", "Mr.Client");
            stackholder.Add("Manager","Mr.Joy");
            stackholder.Add("Team Leader","Mr.Toy");
            stackholder.Add("Sr.developer","Mr.dojoy");
            stackholder.Add("developer","Mr.nodoy");
            ViewData["stackholder"]=stackholder;

            List<string>modules =new List<string>();
            modules.Add("Admin module");
            modules.Add("ShoppingCart module");
            modules.Add("CMS module");
            ViewData["modules"]=modules;
            return View();
        }
<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">@{
    ViewBag.Title = "UsingViewData";
}

<h1>@ViewData["Title"]</h1>
 <div>
   <div>
    <h2>Project Name : @ViewData["ProjectName"]</h2>
   </div>
   <div>
     ProjectDescription :   
     <p>"@ViewData["ProjectDescription"]".</p>
   </div>
   <div>
      Stack Holder :
      <br />

      <ul id="stakholder">
      @foreach ( var stakerholder in ViewData["stackholder"] as Dictionary<string, string> )
      {          
    <li>
        @stakerholder.Key   : @stakerholder.Value
    </li>
      }
     </ul>
   </div>
   <div>
     Project Details:<br />
     <div>
       module List  :
       <ul id="modulelist">
      @foreach ( var module in ViewData["modules"] as List<string> )
      {          
    <li>
        @module
    </li>
      }
     </ul>
        
     </div>
     Project StartDate : @ViewData["StartDate"]  <br />
     Project TotalPrice: @ViewData["TotalPrice"] <br />
     Project TotaDays  : @ViewData["TotalDays"] 
   </div>
 </div>

ViewBag controller:

        public ActionResult UsingViewBag()
        {
            ViewBag.Title = "Using ViewBag";
            ViewBag.ProjectName = "My Test Project";
            ViewBag.ProjectDescription = "This is Test Project to demo Viewdata and viewbag details";
            ViewBag.StartDate = new DateTime(2011, 1, 1);
            ViewBag.TotalPrice = 1000;
            ViewBag.TotalDays = 100;
            Dictionary<string, string> stackholder = new Dictionary<string, string>();
            stackholder.Add("Client", "Mr.Client");
            stackholder.Add("Manager", "Mr.Joy");
            stackholder.Add("Team Leader", "Mr.Toy");
            stackholder.Add("Sr.developer", "Mr.doyjoy");
            stackholder.Add("developer", "Mr.nodoy");
            ViewBag.stackholder = stackholder;

            List<string> modules = new List<string>();
            modules.Add("Admin module");
            modules.Add("ShoppingCart module");
            modules.Add("CMS module");
            ViewBag.modules = modules;
            return View();
        }

對應的頁面:

@{
    ViewBag.Title = "UsingViewBag";
}

<h1>@ViewBag.Title</h1>
 <div>
   <div>
    <h2>Project Name : @ViewBag.ProjectName</h2>
   </div>
   <div>
     ProjectDescription :   
     <p>"@ViewBag.ProjectDescription.</p>
   </div>
   <div>
      Stack Holder :
      <br />

      <ul id="stakholder">
      @foreach ( var stakerholder in ViewBag.stackholder )
      {          
    <li>
        @stakerholder.Key   : @stakerholder.Value
    </li>
      }
     </ul>
   </div>
   <div>
     Project Details:<br />
     <div>
       module List  :
       <ul id="modulelist">
      @foreach ( var module in ViewBag.modules )
      {          
    <li>
        @module
    </li>
      }
     </ul>
        
     </div>
     Project StartDate : @ViewBag.StartDate.ToString("dd-MMM-yyyy") <br />
     Project TotalPrice: @ViewBag.TotalPrice  ₹  <br />
     Project TotaDays  : @ViewBag.TotalDays 
   </div>
 </div>

五、總結

1、ViewData和TempData是字典類型,賦值方式用字典方式,ViewData["myName"] 

2、ViewBag是動態類型,使用時直接添加屬性賦值即可 ViewBag.myName

3、ViewBag和ViewData只在當前Action中有效,等同於View

4、TempData可以通過轉向繼續使用,因為它的值保存在Session中。但TempData只能經過一次傳遞,之后會被系統自動清除

5、ViewData和ViewBag中的值可以互相訪問,因為ViewBag的實現中包含了ViewData

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM