ASP.NET 頁面間資料傳遞方法
0、引言
Web 頁面是無狀態的, 伺服器對每一次請求都認為來自不同使用者,因此,變數的狀態在連續對同一頁面的多次請求之間或在頁面跳轉時不會被保留。在用Asp.NET 設計開發一個Web系統時, 遇到一個重要的問題是如何保證資料在頁面間進行正確、安全和高效地傳送,Asp.net 提供了狀態管理等多種技術來解決儲存和傳遞資料問題,以下來探討.NET 下的解決此問題的各種方法和各自的適用場合。
1、資料傳遞的各種方法和分析
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 中還可以這樣來用,程式碼如下:
1 PreviousPage pg1;2 pg1=(PreviousPage)Context.Handler; 3 Response.Write(pg1.Name); 說明: 此段程式碼用在目標頁面中取出傳遞的值,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 :物件用於單個使用者、一組使用者或所有的使用者。可以為多個請求長時間、高效率的儲存資料。上述幾個方法, 不僅用於情況三, 前面兩種情況都可以使用,只是沒有必要時儘量少用,否則會造成資源浪費或增加程式的複雜性。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-622487/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 頁面之間傳遞資料
- Flutter 頁面間資料傳遞(共享)的幾種常用方式Flutter
- 如何在HarmonyOS NEXT中處理頁面間的資料傳遞?
- Vue 頁面狀態保持頁面間資料傳輸的一種方法Vue
- Flutter:學會在頁面間傳遞引數Flutter
- 023.Vue3入門,父頁面給子頁面傳遞資料Vue
- Vue元件間資料傳遞Vue元件
- Vue元件間傳遞資料Vue元件
- 024.Vue3入門,父頁面給子頁面傳遞多種資料Vue
- asp.net mvc檢視傳遞資料至另一頁的檢視ASP.NETMVC
- Flutter 基礎(十二)路由(頁面跳轉)與資料傳遞Flutter路由
- Flutter基礎(十二)路由(頁面跳轉)與資料傳遞Flutter路由
- Vuejs基本知識(八)【頁面間的引數傳遞】VueJS
- Asp.net WebApi 傳遞json資料以及上傳檔案ASP.NETWebAPIJSON
- vue元件之間的資料傳遞Vue元件
- 微信開發之小程式頁面間如何傳遞引數
- vuejs傳遞資料的方法有哪些VueJS
- 不同順序InBoundHandler之間的資料傳遞
- postman(五):在不同介面之間傳遞資料Postman
- 026.Vue3入門,父頁面給子頁面傳遞資料,在子頁面不能修改,只能改自己的data內容Vue
- 多頁面-HASH-頁面間傳值 Sloth-state
- 微信小程式--頁面與元件之間如何進行資訊傳遞和函式呼叫微信小程式元件函式
- VUE 傳遞資料Vue
- 兄弟元件之間資訊傳遞元件
- 請寫出在ASP.NET中常用的幾種頁面間傳值的方法,並說出它們的特點。ASP.NET
- 微信小程式父子元件之間的資料傳遞微信小程式元件
- Ability之間或者程式間資料傳遞之物件(Sequenceable序列化)物件
- chan中傳遞map資料,傳遞的是引用
- 向上向下傳遞資料
- jsp頁面傳中文到資料庫亂碼JS資料庫
- Vue 全站快取之 vue-router-then :前後頁資料傳遞Vue快取
- 將個人註冊資訊傳到另一個頁面(包含陣列的傳遞)陣列
- [MUI] mui框架實現頁面間傳值UI框架
- Vue學習小札——2.4 父子元件間的資料傳遞Vue元件
- dialog如何向其href指定的頁面傳遞引數?
- [ASP.NET] 使用Request 傳遞引數ASP.NET
- Flutter 中的資料傳遞Flutter
- 父子元件的資料傳遞元件
- 教你如何實現頁面間的資料通訊