在ASP
NET應用中
Web表單之間的導航有多種方式
用超級鏈接
用Response
Redirect
用Server
Transfer
或者用Server
Execute
本文將分析這四種導航方式的異同及其優缺點
幫助你選擇最佳的導航方式
一超級鏈接 從一個表單進入另一個表單最簡單的方式是使用HTML超級鏈接控件
在Web表單中
使用超級鏈接的HTML代碼類如
進入表單
當用戶點擊該超級鏈接
x執行並將結果發送到浏覽器
超級鏈接導航方式幾乎可用於任何地方
包括HTML頁面和普通的ASP頁面
ASP
NET還提供了另一種可替換使用的方法
即HyperLink服務器控件
上述HTML代碼的運行結果和第一個例子相同
因為ASP
NET把HyperLink Web服務器控件視為一個HTML超級鏈接控件
但兩者有一點重要的區別
HyperLink Web服務器控件可以在服務器端編程
具體地說
可以在程序代碼中改變它的NavigateUrl屬性
從而允許構造出具體目標可根據應用的當前狀態動態變化的超級鏈接
例如
Private Sub Button
_Click( _
ByVal sender As System
Object
_
ByVal e As System
EventArgs) _
Handles Button
Click
HyperLink
NavigateUrl =
WebForm
aspx
End Sub
這段代碼執行後
如果用戶點擊鏈接
他看到的將是WebForm
aspx
而不是x
二用程序控制重定向 雖然超級鏈接能夠從一個頁面導航到另一個頁面
但這種導航方式是完全由用戶控制的
有些時候
我們可能要用代碼來控制整個導航過程
包括何時轉到另一個頁面
在這些場合
ASP
NET有三種不同的方式可以達到相似的目的
調用Response對象的Redirect方法
調用Server對象的Transfer或Execute方法
這三種導航方式的行為基本相似
但也有區別
Response
Redirect
Response
Redirect方法導致浏覽器鏈接到一個指定的URL
當Response
Redirect()方法被調用時
它會創建一個應答
應答頭中指出了狀態代碼
(表示目標已經改變)以及新的目標URL
浏覽器從服務器收到該應答
利用應答頭中的信息發出一個對新URL的請求
這就是說
使用Response
Redirect方法時重定向操作發生在客戶端
總共涉及到兩次與服務器的通信(兩個來回)
第一次是對原始頁面的請求
得到一個
應答
第二次是請求
應答中聲明的新頁面
得到重定向之後的頁面
Server
Transfer
Server
Transfer方法把執行流程從當前的ASPX文件轉到同一服務器上的另一個ASPX頁面
調用Server
Transfer時
當前的ASPX頁面終止執行
執行流程轉入另一個ASPX頁面
但新的ASPX頁面仍使用前一ASPX頁面創建的應答流
如果用Server
Transfer方法實現頁面之間的導航
浏覽器中的URL不會改變
因為重定向完全在服務器端進行
浏覽器根本不知道服務器已經執行了一次頁面變換
默認情況下
Server
Transfer方法不會把表單數據或查詢字符串從一個頁面傳遞到另一個頁面
但只要把該方法的第二個參數設置成True
就可以保留第一個頁面的表單數據和查詢字符串
同時
使用Server
Transfer時應注意一點
目標頁面將使用原始頁面創建的應答流
這導致ASP
NET的機器驗證檢查(Machine Authentication Check
MAC)認為新頁面的ViewState已被篡改
因此
如果要保留原始頁面的表單數據和查詢字符串集合
必須把目標頁面Page指令的EnableViewStateMac屬性設置成False
Server
Execute
Server
Execute方法允許當前的ASPX頁面執行一個同一Web服務器上的指定ASPX頁面
當指定的ASPX頁面執行完畢
控制流程重新返回原頁面發出Server
Execute調用的位置
這種頁面導航方式類似於針對ASPX頁面的一次函數調用
被調用的頁面能夠訪問發出調用頁面的表單數據和查詢字符串集合
所以要把被調用頁面Page指令的EnableViewStateMac屬性設置成False
默認情況下
被調用頁面的輸出追加到當前應答流
但是
Server
Execute方法有一個重載的方法
允許通過一個TextWriter對象(或者它的子對象
例如StringWriter對象)獲取被調用頁面的輸出
而不是直接追加到輸出流
這樣
在原始頁面中可以方便地調整被調用頁面輸出結果的位置
為說明其工作過程
下面我們創建一個Web表單
放入一個按鈕控件(Button
)和一個文本控件(Literal
)
在設計界面中轉入代碼視圖
加入一個System
IO名稱空間的Imports語句
然後加入用戶點擊按鈕時執行的代碼
Private Sub Button
_Click( _
ByVal sender As System
Object
_
ByVal e As System
EventArgs) _
Handles Button
Click
Dim sw As StringWriter = New StringWriter()
Server
Execute(
x
sw)
Literal
Text = sw
ToString()
End Sub
然後為同一個Web應用創建第二個頁面x
轉入該頁面的HTML視圖
修改其Page指令禁止ViewState檢查
<%@ Page Language=
vb
AutoEventWireup=
false
Codebehind=
x
vb
Inherits=
Navigate
WebForm
EnableViewStateMac=
false
%>
再轉到設計視圖
為第二個頁面增加一些控件
接下來
把第一個頁面設置成默認頁面
啟動應用
點擊按鈕
WebForm
的控件將顯示在WebForm
中放置Literal按鈕的地方
如圖一
注意頁面標題和URL仍舊顯示原始頁面WebForm
educitycn/img_///gif> 圖一用ServerExecute合並兩個源文件的頁面 用Server
Transfer或Server
Execute方法實現導航時
還要注意一點
最後得到的頁面可能不是合法的HTML頁面
因為最終返回給客戶端的頁面可能包含多個和等標記
IE浏覽器看來能夠容忍並正確處理這類情形
但如果用戶要用到其他的浏覽器
最好仔細測試一下
三比較與選擇 既然從一個頁面導航到另一個頁面的辦法有這麼多
應該如何選擇最佳的導航方式呢?下面是一些需要考慮的因素
如果要讓用戶來決定何時轉換頁面以及轉到哪一個頁面
超級鏈接最適合
如果要用程序來控制轉換的目標
但轉換的時機由用戶決定
使用Web服務器的HyperLink控件
動態設置其NavigateUrl屬性
如果要把用戶連接到另一台服務器上的資源
使用Response
Redirect
用Response
Redirect把用戶連接到非ASPX的資源
例如HTML頁面
如果要將查詢字符串作為URL的一部分保留
使用Response
Redirect
如果要將執行流程轉入同一Web服務器的另一個ASPX頁面
應當使用Server
Transfer而不是Response
Redirect
因為Server
Transfer能夠避免不必要的網絡通信
從而獲得更好的性能和浏覽效果
如果要捕獲一個ASPX頁面的輸出結果
然後將結果插入另一個ASPX頁面的特定位置
則使用Server
Execute
如果要確保HTML輸出合法
請使用Response
Redirect
不要使用Server
Transfer或Server
Execute方法
From:http://tw.wingwit.com/Article/program/net/201311/13491.html