1. 程式人生 > >ViewData、ViewBag、TempData、Session的區別與聯絡

ViewData、ViewBag、TempData、Session的區別與聯絡

一、引言
    記得一次去面試,面試官問了我一個問題,在ASP.NET MVC中,頁面間和Controller與View之間傳遞引數有幾種方式?當時我就我把知道的幾種方式說了一下,然後面試官又問了一下ViewData與ViewBag的區別,今天把ASP.NET MVC中Controller與View之間傳遞引數的方法總結一下以及介紹一下各種方法的區別,ASP.NET MVC中頁面傳值方法有:ViewDataViewBagTempDataSession四種方法。
二、ViewData、ViewBag、TempData、Session介紹
    上面的這四種方法中,ViewData和ViewBag其實是一回事, ViewBag其實是對ViewData的封裝, 其內部其實是使用ViewData實現資料儲存的。唯一的不同點是,ViewBag可以儲存動態型別(dynamic)的變數值, 而ViewData只能儲存String Key/Object Value字典陣列。 所以我們可以將這四種方法歸為三大類, ViewData和ViewBag, TempData, Session。

ViewData["Message"] = "Hello ASP.NET MVC";
// Or
ViewBag.Message = "Hello ASP.NET MVC";

    TempData也是一個String Key/Object Value字典陣列。 和ViewData與ViewBag不同的是其所儲存的資料物件的生命週期。 如果頁面發生了跳轉(Redirection),ViewBag和ViewData中的值將不復存在, 但是TempData中的值依然還在。 換句話講, ViewBag和ViewData儲存的值的生命週期只有在從Controller到View中, 而TempData中的資料不僅在從Controller到View中有效,在不同的Action之間或者從一個頁面跳轉到另一頁面(Controller to Controller)後依然有效。

TempData["Message"] = "Hello ASP.NET MVC";

Session其實和ViewData類似,也是一個String Key/Object Value字典陣列。但是,Session是儲存在服務端的記憶體中或資料庫(各個Web伺服器處理方式不同),所以它的生命週期是最長的。

Session["Message"] = "Hello ASP.NET MVC";

下面我們對每一個傳值方法的特點進行以下總結。

ViewData詳述

  • ViewData是一個繼承自ViewDataDictionary類的Dictionary物件。

  • ViewData用來從Controller向對應的View傳遞值。

  • ViewData的只在當前當前的請求中有效,生命週期和View相同,其值不能在多個請求中共享。

  • 在重定向(redirection)後,ViewData中儲存的變數值將變為null。
  • 在取出ViewData中的變數值是,必須進行合適的型別轉換(隱式或顯式)和空值檢查。

下面我們來看一個簡單的例子,演示一下如何使用ViewData來從Controller向View傳值。

public ActionResult Index()
{
    ViewData["Message"] = "This is a message from ViewData";

    return View();
}

然後,我們從檢視中取出這個變數,
這裡寫圖片描述
執行後,你將會在瀏覽器中看到如下的結果,
這裡寫圖片描述

可能你注意到了,我在從ViewData中取出變數Message時並沒有對其進行型別轉換,那時因為我們儲存的是一個簡單型別的變數值。假如儲存的是複雜物件,在取出是必須進行型別轉換。

綜上, ViewData更適合從Controller向View傳遞簡單物件資料時使用。

ViewBag詳述

  • ViewBag是一個動態型別變數(dynamic),這是C# 4.0引入的新特性,變數型別會在執行時進行解析。
  • ViewBag基本上是ViewData的包裝,也是用來從Controller向View來傳遞值的。
  • ViewBag也只在當前的請求中有效。
  • 在重定向(redirection)後,ViewBag中儲存的變數值將變為null
  • 因為ViewBag是動態型別,所以我們在取得其值時,不需要進行型別轉換。

同樣,我們通過一個簡單的例子來演示一下如何利用ViewBag從Controller向View傳遞資料。

public ActionResult Index()
{
    ViewBag.Message = "This is a message from ViewBag";

    return View();
}

然後,在檢視中取出資料並顯示,
這裡寫圖片描述

最後,執行程式,你將會在瀏覽器中看到如下結果,
這裡寫圖片描述

綜上, ViewBag更適合從Controller向View傳遞複雜物件資料時使用, 因為取出儲存在其中的資料變數時無需進行型別轉換。

TempData詳述

  • TempData是一個繼承自TempDataDictionary類的字典物件,它預設情況下是基於Session儲存機制之上的。(備註:你也可以讓你的TempData基於其他儲存機制之上, 我們可以提供我們自定義的ITempDataProvider來完成,具體可以參見:
    Session-less Controllers and TempData in ASP.NET MVC)

  • TempData是用來在多個Actions或從當前請求向子請求, 頁面發生了重定向(Redirection)時傳遞共享資料。

  • 只有在目標檢視(View)完全載入後才有效。

  • 在取出TempData儲存的變數值時,必須進行合適的型別轉換(隱式或顯式)和空值檢查。

下面,我們透過一個例子來演示一下如何在兩個Action方法中傳遞資料。

首先,建立一個客戶Model類,如下:

public class Customer
{
    public int Id { get; set; }
    public string Code { get; set; }
    public double Amount { get; set; }
}

然後,在Controller中加入如下程式碼:

public ActionResult DisplayCustomer1()
{
    Customer customer = new Customer
    {
        Id = 1001,
        Code = "100101",
        Amount = 100
    };

    TempData["OneCustomer"] = customer;

    return RedirectToAction("DisplayCustomer2");
}

public ActionResult DisplayCustomer2()
{
    Customer customer = TempData["OneCustomer"] as Customer;

    return View(customer);
}

最後,建立一個強型別檢視(Strong Typed View)來顯示客戶資訊。
這裡寫圖片描述
執行程式,瀏覽器中會顯示如下結果:
這裡寫圖片描述
綜上, TempData主要用在需要在多個Actions或者頁面重定向時共享傳遞資料時使用。

Session詳述

  • Session也是ASP.NET MVC程式傳遞值的一種方式,但與TempData不同,使用者的整個會話中Session都不會過期。
  • Session在同一使用者會話過程中的所有請求中有效,比如,重新整理頁面。
  • Session中的值也需要進行型別轉換(隱式或顯式)和非空檢查。

我們仍然使用上面的這個例子,假如我們不用TempData而是使用Session, 也可以得到同樣的結果。

public ActionResult DisplayCustomer1()
{
    Customer customer = new Customer
    {
        Id = 1001,
        Code = "100101",
        Amount = 100
    };

    Session["OneCustomer"] = customer;

    return RedirectToAction("DisplayCustomer2");
}

public ActionResult DisplayCustomer2()
{
    Customer customer = Session["OneCustomer"] as Customer;

    return View(customer);
}

Session的生命週期是最長的,但是它預設使用的是Cookies來儲存資料,所以使用的時候必須注意資料保密的問題。

綜上, Session主要用在需要在多個Controllers, Actions and Views共享資料(非敏感資料)時使用。

圖說傳遞方式的生命週期

這裡寫圖片描述

這裡寫圖片描述
個人微信公眾號,歡迎大家關注。

相關推薦

ip地址域名DNSURL(即網址)的區別聯絡

1.IP地址:每個連線到Internet上的主機都會分配一個IP地址,IP地址是用來唯一標識網際網路上計算機的邏輯地址,機器之間的訪問就是通過IP地址來進行的。IP地址採用二進位制的形式表示的話很長,比較麻煩,為了便於使用,IP地址經常被寫成十進位制的形式,用“

whichtypewhereislocate幾個命令的區別聯絡

對於Linux系統來說,我們經常面對的是字元介面環境。很多時候,我們無法很直觀地搜尋、查詢到我們需要的檔案。另外,每個版本Linux系統的檔案放置路徑也不盡相同。此刻,檔案的搜尋、查詢命令命令就顯得格外重要。為了降低學習、理解成本,我們可以將以下6個命令統一起來

詳解雲端計算大資料和人工智慧的區別聯絡

今天跟大家講講雲端計算、大資料和人工智慧。為什麼講這三個東西呢?因為這三個東西現在非常火,並且它

ViewDataViewBagTempDataSession區別聯絡

一、引言     記得一次去面試,面試官問了我一個問題,在ASP.NET MVC中,頁面間和Controller與View之間傳遞引數有幾種方式?當時我就我把知道的幾種方式說了一下,然後面試官又問了一下ViewData與ViewBag的區別,今天把ASP.NE

sessioncookietoken的區別聯絡

1、定義 session session的中文翻譯是“會話”,當用戶開啟某個web應用時,便與web伺服器產生一次session。伺服器使用session把使用者的資訊臨時儲存在了伺服器上,使用者離開網站後session會被銷燬。這種使用者資訊儲存方式相對cookie來

資料快取sessionStoragelocalStoragecookiesession間的區別聯絡

 核心三步曲:建立-獲取-清除(回收) sessionStorage.setItem("key","123"); sessionStorage.getItem("key"); sessionStorage.removeItem("key"); sessionStora

requestsession的getparametergetAttributesetAttribute方法區別聯絡

request.getparameter()與session.getAttribute()、request.setAttribu

Web服務器Web容器Application服務器反向代理服務器的區別聯系

方向 contain 火墻 性問題 可用 ebsp 負載 消息 防火墻 在Web開發中,經常會聽到Web服務器(Web Server)、Web容器(Web Container)、應用服務器(Application Server)、反向代理服務器(Reverse Proxy

JDKJREJVM的區別聯絡

本文章僅供本人學習參考,如有錯誤和不妥,望指正~~ 轉載連結:https://jingyan.baidu.com/article/425e69e6077283be15fc16ed.html   前幾天面試的時候被問到JDK、JRE、JVM三者的區別,雖然答了出來,但是有些細節還

全/半虛擬化硬體/軟體輔助的全虛擬化之間的區別聯絡

全虛擬化 不需要對GuestOS作業系統軟體的原始碼做任何的修改,就可以執行在這樣的VMM中 在全虛擬化的虛擬平臺中,GuestOS並不知道自己是一臺虛擬機器,它會認為自己就是執行在計算機物理硬體裝置上的HostOS。因為全虛擬化的VMM會將一個OS所能夠操作的CPU、記憶體、外設等物理

資料段資料報資料包幀的區別聯絡

幀與資料包 首先不容易理解的是資料包和幀。 資料包,就是從最上層,一層一層封裝,直到網路層的,最後藉由資料鏈路層傳送出去的資料單元。 幀,是資料鏈路層的傳輸單元。 這麼一看,資料包和幀好像沒什麼不一樣,好像資料傳遞的都是一樣的。可是為什麼會把它們區分開呢?學習 TCP/IP 協議的同

ubuntu中環境變數檔案/etc/profile.profile.bashrc/etc/bash.bashrc之間的區別聯絡(轉)

寫在前面:不同的發行版裡面檔案的命名可能有所不同,如有的發行版etc目錄下有bashrc,有的發行版下面是bash.bashrc。這個根據每個人不同的發行版注意下具體的檔名稱。 /etc/profile:此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行.並從/etc/pro

Python的例項方法類方法和靜態方法之間的區別聯絡

Python的例項方法、類方法和靜態方法 class Test: def test1(self): print('test......') @classmethod def test2(cls): print('test2......c

雜談(第1篇) | 程序執行緒協程的區別聯絡

作為程式設計師,在面試的時候經常被問到:說說程序、執行緒、協程的區別。下面我們就總結一下。 1.面試答案     1.1  程序與執行緒的區別 總述:執行緒是程序的一個實體,一個程序至少有一個執行緒。 1.根本區別;程序是作業系統資源分配的基本

Haddoop中的hdfshbase hive區別聯絡

Hive: Hive不支援更改資料的操作,Hive基於資料倉庫,提供靜態資料的動態查詢。其使用類SQL語言,底層經過編譯轉為MapReduce程式,在Hadoop上執行,資料儲存在HDFS上。 HDFS: HDFS是GFS的一種實現

web伺服器應用伺服器web容器反向代理伺服器區別聯絡

Web伺服器工作原理 HTTP協議基於TCP協議上,是一個應用層協議,用於使用者代理和Web伺服器進行通訊。Web伺服器通常採用一問一答的方式進行工作: 在使用者代理上使用者發起資源請求,請求內容包括但不限於:指定資源的唯一標識URI,指明動作型別(GET/POS

記憶體溢位記憶體洩露的區別聯絡,如何檢測解決

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢位 記憶體洩露 memory leak,是指程式在申請記

0JDKJREJVM區別聯絡

1.基本概念 JVM : 全稱 Java Virtual Machine,即java虛擬機器,是一個用於執行位元組碼的”虛擬計算機”。由於不同的作業系統有不同的虛擬機器,Java虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺上的機器指令執行。實現了“一次編譯,隨處執行”。 這也是J

Python,Pycharm,Anaconda三者的區別聯絡安裝過程及其注意事項

1、致歡迎詞 我將詳細講述在學Python初期的各種手忙腳亂的問題的解決,通過這些步驟的操作,讓你的注意力集中在Python的語法上以及後面利用Python所解決的專案問題上。而我自己作為小白,很不幸的沒有錯過任何的坑,都跳了進去,所以在這裡寫下經驗貼,一方面希望能給後來的學者能夠高效的避開這些

QtCreator中構建qmake執行清理等區別聯絡

qmake:根據實際環境建立專案檔案.pro   並且執行qmake生成適當的Makefile,並且執行qmake[qmake xx.pro]生成除錯[build-ttt-4_8_6-Debug]或者釋出[build-ttt-4_8_6-Release]目錄,裡面含有qmake後