對於一個Web應用程序而言,在各個頁面之間自由的跳轉是是最基本的要求。ASP.NET為頁面跳轉供給了多種方法,這些方法之間有些細微的差別對於考試,或是高級的開發很是重要。下面我們結合實例來學習一下。
頁面跳轉方法主要的可以歸納五種:
一、哄騙Hyperlinks 控件;
二、Cross-Page技能,像Button這樣的控件有一個叫PostBackUrl的屬性,只要給這個屬性設置一個URL就可以實現跳轉;
三、Page類的Response屬性的Redirect方法;
四、Page類的Server屬性的Transfer方法;
五、Page類的Server屬性的Execute。
她們之間的區別我們可以通過以下的例子直不雅的看出來。
起首,新建一個Web項目。新建一個名稱為WebForm.aspx的頁面,雙擊頁面在Page_Load事件中添加如下代碼:
Response.Write("WebForm.aspx Load<br/>");
之后在Default.aspx頁面上放置一個HyperLink控件,同時將Text屬性設置為"跳轉到WebForm.aspx",NavigateUrl屬性設置為"~/ WebForm.aspx"。表示在頁面上顯示"跳轉到WebForm.aspx"字符串為一個超鏈,點擊這串文字時跳轉到"~/WebForm.aspx"頁面,其中"~"表示當前網站的根目錄,當然你也可以輸入完整的URL。
再放置4個Button控件,將個Button的id和Text屬性設置為不異值:CrossPage、Redirect、Transfer、Execute。
放置一個Literal控件,這個控件的作用是可以把作為HTML代碼的字符串在頁面上顯示出來。
將CrossPage 按鍵的PostBackUrl屬性設置為"~/WebForm.aspx",雙擊按鍵在Page_Load事件中添加代碼:Response.Write("Click CrossPage Button<br/>");
雙擊Redirect按鍵,在Click事件中添加如下代碼:
Response.Write("Before Redirect Button<br/>");
Response.Redirect("~//WebForm.aspx");
Response.Write("After Redirect Button<br/>");
雙擊Transfer按鍵,在Click
事件中添加如下代碼:
Response.Write("Before Transfer Button<br/>");
Server.Transfer("~//WebForm.aspx");
Response.Write("After Transfer Button<br/>");
雙擊Execute1按鍵,在Click
事件中添加如下代碼:
Response.Write("Before Execute1 Button<br/>");
Server.Execute("~//WebForm.aspx");
Response.Write("After Execute1 Button<br/>");
雙擊Excute2按鍵,在Click
事件中添加如下代碼:
Response.Write("Before Execute2 Button<br/>");
System.IO.StringWriter wr = new System.IO.StringWriter();
Server.Execute("~//WebForm.aspx", wr);
Literal1.Text = wr.ToString();
Response.Write("After Execute2 Button<br/>");
最后在Page_Load事件中添加
Response.Write("Default.aspx Load<br/>");
預設時效果如圖1
運行Default.aspx頁面,瀏覽器打開Default.aspx頁面並且會顯示"Default.aspx"字樣。當我們點擊HyperLink控件或CrossPage按鍵,瀏覽器跳轉到WebForm.aspx頁面,並且顯示"WebForm.aspx"字樣,而CrossPage按鍵Click事件的"Click CrossPage Button"並沒有輸出。這兩種跳轉技能稱為"Javascript跳轉",在用戶鼠標點擊它們時,直接運行Javascript腳本進行跳轉,而不需要傳回到Web服務器上處理。二者的區別是HyperLink控件可以跳轉到其他網站的頁面,而CrossPage按鍵不行。
如果我們點擊Redirecte按鍵,瀏覽器同樣跳轉到WebForm.aspx頁面,並且顯示"WebForm.aspx"字樣,而Redirecte按鍵Click事件中的信息並沒有輸出。Response.Redirect方法打斷了Web服務器對Default.aspx頁面處理,徑直轉而處理WebForm頁面,而Default頁面進行到一半的處理全部丟棄。所以我們看不到Redirecte按鍵Click事件輸出的信息。這種方式稱為"客戶端跳轉"。由於跳轉是在客戶端出發的,打斷了Web服務器的處理。這種方法可以跳轉到其它網站。
如果我們點擊Transfer按鍵,雖然瀏覽器也跳轉到WebForm.aspx頁面,但顯示為:
Default.aspx Load
Before Transfer Button
WebForm.aspx Load
不像"客戶端跳轉",這里Web服務器並沒有丟棄前一頁面的處理,而是把進行到一半的處理轉到第二個頁面了。這種方式稱為"服務端跳轉",其獨特的地方是:1)處理速度快;2)瀏覽器地址欄仍顯示原來的URL;3)不能跳轉到非ASP.NET頁面或其它web服務器。
如果我們點Execute1按鍵,WebForm頁面上的輸出比Transfer按鍵的輸出在最后又多了"After Execute1 Button"一句,成為:
Default.aspx Load
Before Execute1 Button
WebForm.aspx Load
After Execute1 Button
這種方式稱為"應用程序間跳轉",它沒有打斷Web服務器第一個頁面的處理過程,而是另外開啟一個線程處理第二個頁面,終極的效果是將兩個頁面的處理結果合二為一。Execute2按鍵中程序的作用與Execute1按鍵類似,只不過哄騙Literal控件控制了合並方式。
由這五中頁面跳轉方式繼而又會引發一個問題,那就是"確定調用頁面的方式"。