|
Response.Redirect 簡單地發(fā)送一條消息到瀏覽器,告訴瀏覽器定位到另一個頁面。你可以使用下面的代碼將用戶引導(dǎo)到另一個頁面:
Response.Redirect("WebForm2.ASPx")
或者
Response.Redirect("http://www.cnnas.com/")
Server.Transfer 也是通過一條語句將用戶引導(dǎo)到另一頁面,比如:Server.Transfer("WebForm2.ASPx")。不過,這條語句有一系列獨特的優(yōu)缺點。
首先,通過 Server.Transfer 引導(dǎo)到另一頁面保留服務(wù)器資源,通過更改服務(wù)器端“焦點”和傳輸請求來代替告訴瀏覽器重定向,這就意味著你不會占用較多的 HTTP 請求,因此這可以減輕服務(wù)器的壓力,使你的服務(wù)器運(yùn)行更快。
不過,請注意,由于 "transfer" 只能在同一服務(wù)器端的同一站點間運(yùn)行,所以你不能用 Server.Transfer 將用戶重定向到另一服務(wù)器上的站點。要重定向到服務(wù)器以外的站點,只有 Response.Redirect 能辦到。
其次,Server.Transfer 保留瀏覽器端的 URL 地址。這對流線型的數(shù)據(jù)輸入很有幫助,不過這也增加了調(diào)試的復(fù)雜度。
還有:Server.Transfer 方法還有另一個參數(shù)——"preserveForm"。如果你設(shè)置這個參數(shù)為 True,比如:Server.Transfer("WebForm2.ASPx", True), 那么 query string 和任何 form 變量都會同時傳遞到你定位的頁面。
例:WebForm1.ASPx 有一個文本框名為 TextBox1,你利用 preserveForm 為 True 傳遞到 WebForm2.ASPx,你仍然可以用 Request.Form("TextBox1") 來取得文本框的值。
這種技術(shù)對向?qū)降亩囗撁孑斎牒苡杏茫贿^這里有一個你必須注意的問題是,當(dāng)你使用 preserveForm 參數(shù)時,ASP.NET 有一個 bug,通常情況下,當(dāng)試圖傳遞 form 或 query string 值時會發(fā)生錯誤。請參見:http://support.microsoft.com/default.ASPx?id=kb;en-us;Q316920
非官方的解決辦法是在你要傳遞的目的頁面中設(shè)置 enableViewStateMac 屬性為 True,然后再將其設(shè)置回 False。這說明你需要使用 enableViewStateMac 的 False 值才能解決這個問題。
總結(jié):Response.Redirect 簡單地告訴瀏覽器訪問另一個頁面。Server.Transfer 有利于減少服務(wù)器請求,保持地址欄 URL 不變,允許你將 query string 和 form 變量傳遞到另一個頁面(有一點小小的缺陷)。
重要提示:不要混淆了 Server.Transfer 和 Server.Execute,Server.Execute 執(zhí)行一個頁面,并返回結(jié)果,在過去 Server.Execute 很有用,不過在 ASP.NET 里,它被 fresher 方法所代替,所以忽略 Server.Execute。
使用HttpContext.RewritePath來配合Server.Transfer/Execute
我想由不少人都懂得在Applicaton_Start等事件中使用HttpContext.RewritePath來改變HttpHandler。
如果在Server.Transfer/Execute的調(diào)用前,使用RewritePath,更可以起到指定QueryString的效果。
例如
Context.RewritePath("AA.ASPx","","OKOK=3333");
Context.Server.Transfer("Test2.ASPx");
這樣,就能執(zhí)行Test2.ASPx,并且QueryString是OKOK=3333。
這個用途特別大。我目前用這個方法來避免使用Response.Redirect。
Server.Transfer,Response.Redirect的區(qū)別
Server.Transfer(ASP 3.0 以上) 和 Response.Redirect 在以前的 ASP 中就存在了,Page.Navigate 是 ASP.NET Beta 1 提供的新功能,它們之間的區(qū)別在于:
1、Server.Transfer - 用于把處理的控制權(quán)從一個頁面轉(zhuǎn)移到另一個頁面,在轉(zhuǎn)移的過程中,沒有離開服務(wù)器,內(nèi)部控件(如:request, session 等)的保存的信息不變,因此,你能從頁面 A 跳到頁面 B 而不會丟失頁面 A 中收集的用戶提交信息。此外,在轉(zhuǎn)移的過程中,瀏覽器的 URL 欄不變。
2、Response.Redirect - 發(fā)送一個 HTTP 響應(yīng)到客戶端,告訴客戶端跳轉(zhuǎn)到一個新的頁面,客戶端再發(fā)送跳轉(zhuǎn)請求到服務(wù)器。使用此方法時,將無法保存所有的內(nèi)部控件數(shù)據(jù),頁面 A 跳轉(zhuǎn)到頁面 B,頁面 B 將無法訪問頁面 A 中 Form 提交的數(shù)據(jù)。
3、Page.Navigate - Page.Navigate 實現(xiàn)的功能和 Response.Redirect 差不多,它實際上包括三個步驟:首先調(diào)用 Response.Redirect,其次依次卸載所有的控件,最后調(diào)用 Response.End。
特別要注意的是:在 .NET Beta 2 中,Microsoft 將不再包括 Page.Navigate 這個功能,大家應(yīng)該現(xiàn)在就用 Response.Redirect 來代替 Page.Navigate,以節(jié)省將來升級時的時間。
(1)Server.Transfer方法:
Server.Transfer("m2.ASPx");//頁面轉(zhuǎn)向(服務(wù)器上執(zhí)行).
服務(wù)器停止解析本頁,保存此頁轉(zhuǎn)向前的數(shù)據(jù)后,再使頁面轉(zhuǎn)向到m2.ASPx,
并將轉(zhuǎn)向前數(shù)據(jù)加上m2.ASPx頁結(jié)果返回給瀏覽器.
(2)Server.Execute方法:
Server.Execute("m2.ASPx");
服務(wù)器保存此頁轉(zhuǎn)向前的數(shù)據(jù)后,使頁面轉(zhuǎn)向到m2.ASPx執(zhí)行,
再返回本頁繼續(xù)執(zhí)行.再將三者結(jié)果合并后返回給瀏覽器.
以上都是服務(wù)器端頁面轉(zhuǎn)向所以瀏覽器不出現(xiàn)頁更改記錄(顯示的地址不會改變).
因此,如果用戶刷新此頁,也許會出現(xiàn)一些其它意外情況.
此類頁轉(zhuǎn)向,可完成一些其它功能,比如訪問到前一頁面中的服務(wù)端控件.
(3)Response.Redirect:
當(dāng)瀏覽器請求ASPx頁面時,碰到Redirect(url)方法,
相當(dāng)于告訴瀏覽器,你先需訪問某頁面,于是瀏覽器再向服務(wù)器發(fā)送一個到此頁面的請求.
重定位是通過瀏覽器執(zhí)行的,在服務(wù)器和瀏覽器之間會產(chǎn)生額外的往返過程。
在網(wǎng)絡(luò)狀況不是很好的情況下,兩次請求會大大的
降低應(yīng)用程序的反應(yīng)速度,甚至占用多余的帶寬.
總結(jié):
在網(wǎng)絡(luò)狀態(tài)較好的情況下,Redirect(url)方法效率最高!!
Server.Transfer方法和Server.Execute方法最靈活!!
Server.Execute方法占用資源最多.
NET技術(shù):asp.net 頁面轉(zhuǎn)向 Response.Redirect, Server.Transfer, Server.Execute的區(qū)別,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。