引言
Web頁面是無狀態的
服務器對每一次請求都認為來自不同用戶
因此
變量的狀態在連續對同一頁面的多次請求之間或在頁面跳轉時不會被保留
在用ASP
NET 設計開發一個Web系統時
遇到一個重要的問題是如何保證數據在頁面間進行正確
安全和高效地傳送
Asp
net 提供了狀態管理等多種技術來解決保存和傳遞數據問題
以下來探討
NET 下的解決此問題的各種方法和各自的適用場合
ASP
NET頁面間數據傳遞的各種方法和分析
使用Querystring 方法
QueryString 也叫查詢字符串
這種方法將要傳遞的數據附加在網頁地址(URL)後面進行傳遞
如頁面A
aspx 跳轉到頁面B
aspx
可以用Request
Redirect(
B
aspx?參數名稱=參數值
)方法
也可以用超鏈接
頁面跳轉後
在目標頁面中可用Ruquest[
參數名稱
]來接收參數
使用QuerySting 方法的優點是實現簡單
不使用服務器資源
缺點是傳遞的值會顯示在浏覽器的地址欄上
有被篡改的風險
不能傳遞對象
只有在通過URL 請求頁時查詢字符串才是可行的
利用隱藏域
隱藏域不會顯示在用戶的浏覽器中
一般是在頁面中加入一個隱藏控件
與服務器進行交互時把值賦給隱藏控件並提交給下一頁面
隱藏域可以是任何存儲在網頁中的與網頁有關的信息的存儲庫
使用隱藏域存入數值時用
hidden 控件
value=數值
取出接收數值時用
變量=hidden 控件
value
使用隱藏域的優點是實現簡單
隱藏域是標准的HTML 控件
不需要復雜的編程邏輯
隱藏域在頁上存儲和讀取
不需要任何服務器資源
幾乎所有浏覽器和客戶端設備都支持具有隱藏域的窗體
缺點是存儲結構少
僅僅支持簡單的數據結構
存儲量少
因為它被存儲在頁面本身
所以無法存儲較大的值
而且大的數據量會受到防火牆和代理的阻止
ViewState
ViewState 是由ASP
NET 頁面框架管理的一個隱藏的窗體字段
當ASP
NET 執行某個頁面時
該頁面上的ViewState 值和所有控件將被收集並格式化成一個編碼字符串
然後被分配給隱藏窗體字段的值屬性
使用ViewState 傳遞數據時可用
ViewState [
變量名
]=數值
在取出數據時用
變量=ViewState[
變量名
]
使用ViewState 的優點是
在對同一頁的多個請求間自動保留值
不用服務器端資源
實現簡單
視圖狀態中的值經過哈希計算和壓縮
並且針對Unicode 實現進行編碼
其安全性要高於使用隱藏域
缺點是因為ViewState 存儲在頁面本身
因此如果
存儲較大的值
用戶顯示頁和發送頁時的速度可能會減慢
雖然視圖狀態以哈希格式存儲數據
但它仍可以被篡改
使用Cookie
Cookie 可以在頁面之間傳遞少量信息
可以存儲在客戶端的文本文件中
也可存儲在客戶端的內存中
Cookie 方法適用於存儲少量頁面中經常改動的信息
如為登陸過的網站保存登陸用戶名
為用戶輸入提供方便
還有在一些用戶自定義項目上保存用戶的個性化設置
使用Cookie傳遞數據時可用
Response
Cookies[
鍵名
]=鍵值
取出數據用
變量名=Request
Cookies[
鍵名
]
使用Cookie 優點是
Cookie 存儲在客戶端
不使用服務器資源
實現簡單
可配置到期時間
缺點是
可以存儲的數據量比較少
由於Cookie 並不被所有的浏覽器支持
而且還可能被用戶禁止或刪除
所以不能用於保存關鍵數據
另外
Cookie 保存的形式是簡單的明文文本
在它裡面不宜保存敏感的
未加密的
數據
使用Application 變量
使用Application 變量也可以實現頁面間的傳值
Application變量是全局性的
所有用戶共享一個Application 變量
一旦定義
它將影響到程序的所有部分
如果想在整個應用程序范圍使用某個變量值Application 對象將是最佳的選擇
存入數據時
把值添加到Application 變量裡
Application[
變量名
]=數值
取出數據用
變量=Application[
變量名
]
在不需要使用該Application 時
要顯式清除它
Application[
量名
]=null
Application 優點
易於使用
全局范圍
可供應用程序中的所有頁來訪問
缺點
若保存數據的服務器端進程被損壞(如因服務器崩潰
升級或關閉而損壞)
那麼數據就會丟失
所以利用Application 一定要有保底的策略
占用服務器端的內存
這可能會影響服務器的性能以及應用程序的可伸縮性
使用Session 變量
Session 對象可以用來存儲需要維護的指定對話的信息
不同的客戶端生成不同的Session 對象
Session 用於存儲特定於單獨會話的短期信息
Session 的使用方法和格式與Application 相同
優點
易於實現
並且提供較高的安全性和持久性
可以應對IIS 重啟和輔助進程重啟
可在多進程中使用
缺點是耗用服務器端的內存
所以不要存儲大量的信息
Session 最常見的用途是與Cookie 一起向Web 應用程序提供用戶標識功能
Session也可用於不支持Cookie 的浏覽器
但是
使用無Cookie 的Session 需要將會話標識符放置在查詢字符串中
同樣會遇到本文在查詢字符串一節中陳述的安全問題
使用類的靜態屬性
這種方法是利用類的靜態屬性實現兩個頁面間的值傳
定義一個包含靜態屬性的類
將要傳送的值賦給靜態屬性
目標頁面中可以通過靜態屬性獲得源頁面中要傳的值
優點是可以方便傳送多個數據
缺點是需要額外編程
增加程序設計的工作量
占用服務器內存
使用Server
Transfer
通過Server
Transfer 方法把執行流程從當前的ASPX 文件轉到同一服務器上的另一個ASPX 頁面的同時
可保留表單數據或查詢字符串
做法是把該方法的第二個參數設置成True
在第一個頁面用Server
Transfer(
目標頁面名
aspx
true)
目標頁面取出數據用
Ruquest
Form[
控件名稱
]或Ruquest
QueryString[
控件名稱
]
Asp
net
中還可以這樣來用
代碼如下
PreviousPage pg
pg
=(PreviousPage)Context
Handler
Response
Write(pg
Name)
說明
此段代碼用在目標頁面中取出傳遞的值
Previous
Page 是原頁面的類名
Name 是在原頁面定義的屬性
需要傳遞 的數據存入到此屬性中
使用這種方法
需要寫一些代碼以創建一些屬性以便可以 在另一個頁面訪問它
可以在另一個頁面以對象屬性的方式來 存取數值
這個方法在頁面間值傳遞中是特別有用的
這種方法 不但簡潔
同時又是面向對象的
Cache
Cache 具有強大的數據操作功能
以鍵值對集合的形式存 儲數據
可以通過指定關鍵字來插入和檢索數據項
它的基於依 賴性的終止功能
使它能夠精確控制如何並及時更新和消除緩 存中的數據
它可以內部進行鎖定管理
不需要象Application 對象那樣使用Lock()和Unlock()方法進行串行化管理
缺點是使用 方法較復雜
使用不當反而降低性能
不同頁面跳轉情況下可采用的傳值方法
情況一
源頁面可以跳轉到目標頁面
源頁面傳遞數據給目標頁面
使用查詢字符串
將少量信息從一頁傳輸到另一頁以及不存在安全性問題時
是一個簡單常用的方法
使用Server
Transfer方法
可傳遞表單數據或查詢字符串到另一個頁面
還可以保存初始頁的HttpContext
當目標頁和源頁面在同一個服務器 時
可以用此方法
情況二
頁面傳遞數值給自身頁面
即在對同一頁的多個請求間保留值
ViewState 屬性可提供具有基本安全性的功能
也可用隱藏域
存儲少量回發到自身或另一頁的頁信息時使用
不考慮安全性問題時使用
情況三
源頁面傳遞數值給目標頁面
而源頁面不能直接連接到目標頁面
有多個方法
具體用哪個要看具體情況
Application
存儲由多個用戶使用且更改不頻繁的全局信息
此時安全性不成為問題
不要存儲大量的信息
Session
存儲特定於單獨會話的短期信息
並且需要較高的安全性
不要在會話狀態中存儲大量的信息
需要注意
將為應用程序中每一會話的生存期創建並維護會話狀態對象
在支持許多用戶的應用程序中
這可能會占用大量服務器資源並影響可縮放性
Cookie
當您需要在客戶端存儲少量信息以及不存在安全性問題時使用
類的靜態屬性
方便傳送多個數據
(www
lian
com)
Cache
對象用於單個用戶
一組用戶或所有的用戶
可以為多個請求長時間
高效率的保存數據
上述幾個方法
不僅用於情況三
前面兩種情況都可以使用
只是沒有必要時盡量少用
否則會造成資源浪費或增加程序的復雜性
From:http://tw.wingwit.com/Article/program/net/201311/14094.html