天天看點

一起談.NET技術,ASP.NET頁面間資料傳遞的方法

  00、引言

  Web頁面是無狀态的, 伺服器對每一次請求都認為來自不同使用者,是以,變量的狀态在連續對同一頁面的多次請求之間或在頁面跳轉時不會被保留。在用ASP.NET 設計開發一個Web系統時, 遇到一個重要的問題是如何保證資料在頁面間進行正确、安全和高效地傳送,Asp.net 提供了狀态管理等多種技術來解決儲存和傳遞資料問題,以下來探讨.NET 下的解決此問題的各種方法和各自的适用場合。

  1、ASP.NET頁面間資料傳遞的各種方法和分析

  1.1 使用Querystring 方法

  QueryString 也叫查詢字元串, 這種方法将要傳遞的資料附加在網頁位址(URL)後面進行傳遞。如頁面A.aspx 跳轉到頁面B.aspx,可以用Request.Redirect("B.aspx?參數名稱=參數值")方法,也可以用超連結:,頁面跳轉後,在目标頁面中可用Ruquest["參數名稱"]來接收參數。使用QuerySting 方法的優點是實作簡單, 不使用伺服器資源;缺點是傳遞的值會顯示在浏覽器的位址欄上,有被篡改的風險,不能傳遞對象,隻有在通過URL 請求頁時查詢字元串才是可行的。

  1.2 利用隐藏域

  隐藏域不會顯示在使用者的浏覽器中, 一般是在頁面中加入一個隐藏控件, 與伺服器進行互動時把值賦給隐藏控件并送出給下一頁面。隐藏域可以是任何存儲在網頁中的與網頁有關的資訊的存儲庫。使用隐藏域存入數值時用:hidden 控件.value=數值,取出接收數值時用:變量=hidden 控件.value。使用隐藏域的優點是實作簡單, 隐藏域是标準的HTML 控件,不需要複雜的程式設計邏輯。隐藏域在頁上存儲和讀取,不需要任何伺服器資源,幾乎所有浏覽器和用戶端裝置都支援具有隐藏域的窗體。缺點是存儲結構少,僅僅支援簡單的資料結構,存儲量少,因為它被存儲在頁面本身,是以無法存儲較大的值,而且大的資料量會受到防火牆和代理的阻止。

  1.3 ViewState

  ViewState 是由ASP.NET 頁面架構管理的一個隐藏的窗體字段。當ASP.NET 執行某個頁面時,該頁面上的ViewState 值和所有控件将被收集并格式化成一個編碼字元串, 然後被配置設定給隐藏窗體字段的值屬性。使用ViewState 傳遞資料時可用:ViewState [" 變量名"]=數值,在取出資料時用:變量=ViewState["變量名"]。使用ViewState 的優點是:在對同一頁的多個請求間自動保留值,不用伺服器端資源,實作簡單,視圖狀态中的值經過哈希計算和壓縮,并且針對Unicode 實作進行編碼,其安全性要高于使用隐藏域;缺點是因為ViewState 存儲在頁面本身,是以如果存儲較大的值,使用者顯示頁和發送頁時的速度可能會減慢。雖然視圖狀态以哈希格式存儲資料,但它仍可以被篡改。

  1.4 使用Cookie

  Cookie 可以在頁面之間傳遞少量資訊, 可以存儲在用戶端的文本檔案中,也可存儲在用戶端的記憶體中。Cookie 方法适用于存儲少量頁面中經常改動的資訊, 如為登陸過的網站儲存登陸使用者名,為使用者輸入提供友善,還有在一些使用者自定義項目上儲存使用者的個性化設定。使用Cookie傳遞資料時可用:Response.Cookies["鍵名"]=鍵值;取出資料用:變量名=Request.Cookies["鍵名"]。使用Cookie 優點是:Cookie 存儲在用戶端, 不使用伺服器資源,實作簡單,可配置到期時間。缺點是:可以存儲的資料量比較少,由于Cookie 并不被所有的浏覽器支援,而且還可能被使用者禁止或删除,是以不能用于儲存關鍵資料。另外,Cookie 儲存的形式是簡單的明文文本,在它裡面不宜儲存敏感的、未加密的資料。

  1.5 使用application 變量

  使用Application 變量也可以實作頁面間的傳值,Application變量是全局性的,所有使用者共享一個Application 變量,一旦定義,它将影響到程式的所有部分。如果想在整個應用程式範圍使用某個變量值Application 對象将是最佳的選擇。存入資料時, 把值添加到Application 變量裡:Application["變量名"]=數值;取出資料用:變量=Application["變量名"];在不需要使用該Application 時,要顯式清除它:Application["量名"]=null。

  Application 優點:易于使用,全局範圍。可供應用程式中的所有頁來通路。缺點:若儲存資料的伺服器端程序被損壞(如因伺服器崩潰、更新或關閉而損壞),那麼資料就會丢失,是以利用Application 一定要有保底的政策;占用伺服器端的記憶體,這可能會影響伺服器的性能以及應用程式的可伸縮性。

  1.6 使用session 變量

  Session 對象可以用來存儲需要維護的指定對話的資訊,不同的用戶端生成不同的Session 對象。Session 用于存儲特定于單獨會話的短期資訊。Session 的使用方法和格式與Application 相同。

  優點:易于實作,并且提供較高的安全性和持久性,可以應對IIS 重新開機和輔助程序重新開機,可在多程序中使用。缺點是耗用伺服器端的記憶體。是以不要存儲大量的資訊。Session 最常見的用途是與Cookie 一起向Web 應用程式提供使用者辨別功能,Session也可用于不支援Cookie 的浏覽器。但是,使用無Cookie 的Session 需要将會話辨別符放置在查詢字元串中,同樣會遇到本文在查詢字元串一節中陳述的安全問題。

  1.7 使用類的靜态屬性

  這種方法是利用類的靜态屬性實作兩個頁面間的值傳。定義一個包含靜态屬性的類;将要傳送的值賦給靜态屬性;目标頁面中可以通過靜态屬性獲得源頁面中要傳的值。

優點是可以友善傳送多個資料,缺點是需要額外程式設計,增加程式設計的工作量,占用伺服器記憶體。

  1.8 使用Server.Transfer

  通過Server.Transfer 方法把執行流程從目前的ASPX 檔案轉到同一伺服器上的另一個ASPX 頁面的同時,可保留表單資料或查詢字元串,做法是把該方法的第二個參數設定成True,在第一個頁面用Server.Transfer("目标頁面名.aspx",true);目标頁面取出資料用:Ruquest.Form["控件名稱"]或Ruquest.QueryString["控件名稱"]。Asp.net2.0 中還可以這樣來用,代碼如下:

  說明: 此段代碼用在目标頁面中取出傳遞的值,Previous- Page 是原頁面的類名,Name 是在原頁面定義的屬性, 需要傳遞 的資料存入到此屬性中。

  使用這種方法, 需要寫一些代碼以建立一些屬性以便可以 在另一個頁面通路它, 可以在另一個頁面以對象屬性的方式來 存取數值,這個方法在頁面間值傳遞中是特别有用的,這種方法 不但簡潔,同時又是面向對象的。

  1.9 Cache

  Cache 具有強大的資料操作功能, 以鍵值對集合的形式存 儲資料,可以通過指定關鍵字來插入和檢索資料項。它的基于依 賴性的終止功能, 使它能夠精确控制如何并及時更新和消除緩 存中的資料。它可以内部進行鎖定管理,不需要象Application 對象那樣使用Lock()和Unlock()方法進行串行化管理。缺點是使用 方法較複雜,使用不當反而降低性能.

  2、不同頁面跳轉情況下可采用的傳值方法

  2.1 情況一:源頁面可以跳轉到目标頁面,源頁面傳遞資料給目标頁面

  使用查詢字元串, 将少量資訊從一頁傳輸到另一頁以及不 存在安全性問題時,是一個簡單常用的方法;使用Server.Transfer方法,可傳遞表單資料或查詢字元串到另一個頁面,還可以 儲存初始頁的HttpContext, 當目标頁和源頁面在同一個伺服器 時,可以用此方法。

  2.2 情況二:頁面傳遞數值給自身頁面

  即在對同一頁的多個請求間保留值, ViewState 屬性可提供具有基本安全性的功能。也可用隐藏域,存儲少量回發到自身或另一頁的頁資訊時使用,不考慮安全性問題時使用。

  2.3 情況三:源頁面傳遞數值給目标頁面,而源頁面不能直接連接配接到目标頁面。

  有多個方法,具體用哪個要看具體情況。

  Application: 存儲由多個使用者使用且更改不頻繁的全局資訊,此時安全性不成為問題。不要存儲大量的資訊。Session:存儲特定于單獨會話的短期資訊,并且需要較高的安全性。不要在會話狀态中存儲大量的資訊。需要注意,将為應用程式中每一會話的生存期建立并維護會話狀态對象。在支援許多使用者的應用程式中, 這可能會占用大量伺服器資源并影響可縮放性。

  Cookie: 當您需要在用戶端存儲少量資訊以及不存在安全性問題時使用。類的靜态屬性,友善傳送多個資料。

  Cache :對象用于單個使用者、一組使用者或所有的使用者。可以為多個請求長時間、高效率的儲存資料。上述幾個方法, 不僅用于情況三, 前面兩種情況都可以使用,隻是沒有必要時盡量少用,否則會造成資源浪費或增加程式的複雜性。

繼續閱讀