.Net常見面試題整理(3)—asp.net中的頁面重定向詳解


        頁面重定向是一個不大不小的問題, 說它不大是因為我們作為web開發者經常會遇到頁面重定向的問題, 而我們平時也似乎能很好的把這個問題給解決掉. 說他不小是因為雖然我們都知道部分重定向的方法, 但是我們並沒有完整的了解所有頁面重定向的方法, 同時也並不是特別的清楚他們之間的區別. 這就造成了我們在選擇頁面重定向的方式上大多數的時候是盲目的. 本篇文章希望和大家一起將幾種頁面重定向的方法做一個總結和比較, 為以后的工作和學習帶來一點點的幫助.
 
        重定向的具體定義我也沒有去深究, 不知道網頁上的超鏈接、js中的windows.location 等算不算重定向的范疇。不過這些不是我們討論的重點,我們今天主要討論的是三種:Response.Redirect, Server.Transfer, Server.Execute。
 
一、Response.Redirect
        這個我相信是大家經常用的一種方法,至少我大多數情況下是用的這種方法。Response.Redirect(url)這種方法是一種客戶端重定向的方法。它告訴瀏覽器,你需要先訪問另外一個網頁,於是瀏覽器就跳到了另外的一個頁面去了。
        我們分析下服務器是如何讓瀏覽器跳轉的:
        首先有兩個頁面:
;
        他們各自的內容是: RedictionA:
 
RedictionB:
 
點擊A頁面的Button, 后會跳轉到B頁面. 代碼如下:
        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Redirect("RedictionB.aspx");
        }

 

當我們點擊Button之后, 我們查看下網頁的http請求為:
 
        好了, 我們似乎發現了什么. 首先我們發現了, 我們點擊一下Button, 有兩個結果返回, 也就是說服務器端和客戶端交互了兩次. 另外第一個請求返回的是302, 也就是臨時性的重定向.
        再去看看請求的具體內容:
 
        到這里我們就明白了, 原來使用Response.Redirect方法實際上就是服務器給瀏覽器發送了一個302重定向而已.
 
        我們現在也明白了Response.Redirect方法的缺點是有兩次服務器端和客戶端的交互, 這樣會占用額外的帶寬和資源, 在網絡環境不好的情況下, 會大大降低網頁的反應速度. 你會發現瀏覽器會刷新一次, 停一會, 又刷新一次.
        另外Response.Redirect只能通過get方式傳遞數據, 所以A頁面中的數據不會自動提交給B頁面. 只能通過Url的方式來傳遞數據. 當然如果傳遞的數據中含有漢字, 在某些瀏覽器中可能不會識別, 所以需要通過Server.UrlEncode處理下.
 
二、Server.Transfer
        Server.Transfer方法是在服務器上執行, 客戶端並不知情. 這樣做的后果就是雖然網頁的內容是跳轉之后的頁面, 但是瀏覽器地址欄上的Url仍然是跳轉前的頁面Url.
        另外一個需要注意的問題是, 默認情況下, Server.Transfer跳轉時會自動將前一個頁面的數據以Post的方式傳遞個新的頁面, 隨后將這些數據以及跳轉后的頁面一起返回給客戶端.
        同樣的,我們新建兩個頁面:
    
        頁面A:
    
   頁面B:
 
    
 
當點擊頁面A中的Button時, 會跳轉到B頁面, 代碼如下:
        protected void Button1_Click(object sender, EventArgs e)
        {
            //默認情況下,會將當前頁面保存,通過Post的方式傳遞給跳轉的頁面,如果加上false參數即不傳遞值。
            Server.Transfer("TransferB.aspx");
            //Server.Transfer("TransferB.aspx", true);
            //Server.Transfer("TransferB.aspx", false);
        }

 

    因為使用Server.Transfer方法可以將前一頁面的數據傳遞給B頁面, 所以在B頁面的Page_Load方法中如下接收:
        public string msg;
        protected void Page_Load(object sender, EventArgs e)
        {
            msg = Request["TextBox1"];
            if (string.IsNullOrEmpty(msg))
            {
                msg = "沒有數據!";
            }
        }

 

        所以當在TextBox中填寫數據時, 會將這些數據傳遞給B頁面的. 如下圖:
             
 
        使用Server.Transfer方法的注意事項是:
            1、跳轉的頁面和跳轉前頁面必須在同一服務器下, 比如我們如果跳轉到baidu是不行的, 但是使用Response.Redirect是可以的。
            2、這種方法可以跳過登陸保護, 比如B頁面是需要登陸的, Form認證, A頁面不需要, 這樣是可以直接得到B頁面的內容的.
            3、Server.Transfer還有一個重載的方法, 可以在頁面的后面跟上一個bool值, 指定需不需要將前頁面的數據傳遞給后頁面. 當然默認情況下是傳遞的.
            4、Server.Transfer方法會將A頁面的數據和B頁面一起返回給客戶端, 如下圖所示:
       
 
三、Server.Execute
         Server.Execute方法和Server.Transfer方法相似, 但是他們有一個不同點就是Server.Transfer方法是將A頁面的數據和B頁面一起返回. 而Server.Execute方法則是A頁面的數據返回到B頁面, 經過B頁面的處理再返回給A頁面.
        這個過程有點混亂, 實際上就是數據需要經過B頁面處理之后再返回給A頁面. 當然也可以直接在B頁面中生成一些數據再返回給A頁面.
 
        直接上例子:兩個頁面:
            
        ExecuteA:
            
        ExecuteB:
            
        當點擊A頁面的Button, 觸發的事件是:
        protected void Button1_Click(object sender, EventArgs e)
        {
            Server.Execute("ExecuteB.aspx");
        }

 

        B頁面在Page_Load中接收並處理數據, 所以Page_Load為:
        protected void Page_Load(object sender, EventArgs e)
        {
            string text = Request["TextBox1"];
            if (String.IsNullOrEmpty(text))
            {
                text = "沒有數據";
            }
            text = "這是B頁面的數據。原有的值為:" + text;
            TextBox1.Text = text;
        }

 

        執行結果為:
           
        
        使用Server.Execute方法時,同Server.Transfer一樣,只能跳轉到同一服務器下的頁面。並且A頁面和B頁面同時返回到瀏覽器。這種方法主要是用在頁面設計上, 將一個頁面的結果插入到另外一個頁面中使用. 類似於將一個頁面嵌套如另外一個頁面.
        默認情況下, B頁面是直接輸出在A頁面之上的. 但是Server.Execute有一個重載的方法, 可以將B頁面輸出為TextWrite對象, 這樣就可以在B頁面的跳轉回來的時候對其進行處理,讓其顯式在你希望顯式的地方。對了, 處理TextWrite對象的代碼應該放在Server.Execute()后面,跳轉回來會直接執行。
 
四、頁面重定向方法的選擇
        
        下面這段是摘自參考文章的:
  • 如果要讓用戶來決定何時轉換頁面以及轉到哪一個頁面,超級鏈接最適合。
  • 如果要用程序來控制轉換的目標,但轉換的時機由用戶決定,使用Web服務器的HyperLink控件,動態設置其NavigateUrl屬性。
  • 如果要把用戶連接到另一台服務器上的資源,使用Response.Redirect。
  • 用Response.Redirect把用戶連接到非ASPX的資源,例如HTML頁面。
  • 需要把查詢字符串作為url一部分保留傳給服務器的時候,因為其他2種方法不能做到2次postback,把數據先帶回服務器 ,使用Response.Redirect。
  • 如果要將執行流程轉入同一Web服務器的另一個ASPX頁面,應當使用Server.Transfer而不是Response.Redirect,因為Server.Transfer能夠避免不必要的網絡通信,從而獲得更好的性能和瀏覽效果。
  • 如果要捕獲一個ASPX頁面的輸出結果,然后將結果插入另一個ASPX頁面的特定位置,則使用Server.Execute。
  • 如果要確保HTML輸出合法,請使用Response.Redirect,不要使用Server.Transfer或Server.Execute方法。

 

參考文章:http://developer.51cto.com/art/201107/275613.htm

本文地址:http://www.cnblogs.com/zhangkai2237/archive/2013/01/27/2878970.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM