在ASP.NET中,在后臺傳值方式目前大多都是用 Response.Redirect("頁面地址") 來重定向頁面的,但是現在還有一種方式也可以達到重定向頁面的作用,而且在某些時刻會起到一種很棒的效果,那就是使用 Server.Transfer("頁面地址") 來重定向地址。
現在我們來詳細了解一下這兩種重定向頁面地址的用法和區別:
Response.Redirect :Response.Redirect 會將地址輸出至瀏覽器,執行重定向操作。但是請注意,在程序執行到Response.Redirect("頁面地址") 語句時,會立即中斷當前頁面的生命周期,直接向客戶端返回信息,讓客戶端進行重定向操作。這個時候頁面URL將會顯示重定向后的地址。
Server.Transfer :Server.Transfer 是一個很奇特的方法。當使用 Server.Transfer 方法重定向頁面時,雖然頁面也會被重定向至指定頁,但是并不會在瀏覽器的URL上體現出來,并且若重定向的頁面后有參數,也不會顯示在瀏覽器的URL上。
舉一個例子: 有 index1.aspx 和index2.aspx 兩個頁面,在 index1.aspx 的后臺 index1.aspx.cs 中使用 Server.Transfer重定向頁面至 index2.aspx 頁面,
protected void Page_Load(object sender, EventArgs e) { Server.Transfer("index2.aspx?name=Tom"); }
在index2.aspx.cs代碼中接收并顯示傳來的值,
protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { string name = Request.QueryString["name"]; Response.Write(name); } }
設置index1.aspx頁面為起始頁,運行程序,我們會發現,在頁面為index1.aspx頁面上輸出了Tom。
事實上,傳統的 Response.Redirect 會在程序運行至該語句時,強制中斷該頁面的生命周期,重定向至新的指定頁面上去。而 Server.Transfer 并不會終止該頁面,而是將當前頁面響應的輸出流終止,然后重新定位請求至index2.aspx頁面,也就是說,在index1.aspx這個頁面的響應流并沒有終止的情況下,它去請求index2.aspx頁面,然后將index2.aspx頁面操作的結果響應給客戶。
Server.Transfer優缺點:Server.Transfer因為瀏覽器URL上并沒有看到有重定向痕跡,因此并不會占用較多的 HTTP 請求,因此這可以減輕服務器的壓力,使你的服務器運行更快。不過,請注意,由于 "transfer" 只能在同一服務器端的同一站點間運行,所以你不能用 Server.Transfer 將用戶重定向到另一服務器上的站點。要重定向到服務器以外的站點,只有 Response.Redirect 能辦到。 其次,Server.Transfer 保留瀏覽器端的 URL 地址。這對流線型的數據輸入很有幫助,不過這也增加了調試的復雜度。
Server.Transfer 方法還有另一個參數——"preserveForm"。如果你設置這個參數為 True,比如:Server.Transfer("WebForm2.aspx", True), 那么 query string 和任何 form 變量都會同時傳遞到你定位的頁面。
例:WebForm1.aspx 有一個文本框名為 TextBox1,你利用 preserveForm 為 True 傳遞到 WebForm2.aspx,你仍然可以用 Request.Form("TextBox1") 來取得文本框的值。
這種技術對向導式的多頁面輸入很有用,不過這里有一個你必須注意的問題是,當你使用 preserveForm 參數時,ASP.NET 有一個 bug,通常情況下,當試圖傳遞 form 或 query string 值時會發生錯誤。請參見:http://support.microsoft.com/default.aspx?id=kb;en-us;Q316920
非官方的解決辦法是在你要傳遞的目的頁面中設置 enableViewStateMac 屬性為 True,然后再將其設置回 False。這說明你需要使用 enableViewStateMac 的 False 值才能解決這個問題。
總結:Response.Redirect 簡單地告訴瀏覽器訪問另一個頁面。Server.Transfer 有利于減少服務器請求,保持地址欄 URL 不變,允許你將 query string 和 form 變量傳遞到另一個頁面(有一點小小的缺陷)。
文章列表