劉洪坡,李金鎖,石 磊
(河南工業(yè)職業(yè)技術(shù)學院,河南 南陽 473000)
ASP.NET是微軟提供的Web應用程序開發(fā)平臺,為建立和部署企業(yè)級Web應用程序提供了服務。對Web應用程序開發(fā)而言,在各個頁面之間自由地跳轉(zhuǎn)是最基本的要求。ASP.NET為頁面導航提供了多種技術(shù),這些技術(shù)之間有細微的差別,要對它們有一個系統(tǒng)的認識和了解才能發(fā)揮其各自優(yōu)勢。了解頁面導航的原理,明確各技術(shù)的優(yōu)缺點,根據(jù)需要靈活選擇適合的導航技術(shù)對Web應用程序開發(fā)來說非常重要。
從一個頁面導航到另外一個頁面最簡單的方式是使用超級鏈接,在ASP.NET中,既支持標簽,又提供了一個Web服務器控件(HyperLink控件)來實現(xiàn)超級鏈接。
Hyperlink控件是用NavigateUrl屬性來指定要導航到的頁面的Url地址,其用法如:
使用超級鏈接實現(xiàn)頁面導航,主要用于由用戶來決定何時跳轉(zhuǎn)頁面,可以用程序來控制導航目標。
ASP.NET從2.0開始,引入了一種新的數(shù)據(jù)提交方法:Cross-Page技術(shù),即PostBack觸發(fā)在另一個頁面。支持此技術(shù)的是一個名為PostBackUrl的屬性,用于指定所發(fā)送到的Url地址,該屬性由IButtonControl接口定義,實現(xiàn)該接口的控件,如ImageButton、LinkButton、Button,都擁有此屬性。將PostBackUrl屬性設(shè)置為要導航到的頁面Url地址,如:
在用ASP.NET開發(fā)Web應用程序的過程中,有時需要實現(xiàn)頁面自動導航,要實現(xiàn)此功能,可使用ASP.NET提供的內(nèi)部對象 Response和Server以編程的方式加以解決。根據(jù)導航操作發(fā)生的位置不同分為客戶端導航、服務端導航兩種方式。
Response.Redirect方法導航操作發(fā)生在客戶端,導航機制是:首先發(fā)送一個Http響應到客戶端,通知客戶端跳轉(zhuǎn)到一個新的頁面,然后客戶端再發(fā)送頁面導航請求到服務器端,Web服務器執(zhí)行目標頁面,并把執(zhí)行結(jié)果發(fā)送回客戶端,其用法如:Response.Redirect("~\WebForm2.aspx"),該代碼執(zhí)行后,將被導航到WebForm2頁面。使用Response.Redirect方法實現(xiàn)頁面導航后,客戶端瀏覽器地址欄的Url地址將變?yōu)槟繕隧撁妫柬撁孢M行的處理全部丟棄,其內(nèi)部控件保存的所有信息將丟失,所以不能訪問原始頁面提交的數(shù)據(jù),但我們可以使用Session、Cookies、Application等對象進行頁面間數(shù)據(jù)的傳遞。該方法與Web服務器進行了兩次通信,一次是對原始頁面的請求,另一次是對目標頁面的請求,所以響應速度較慢。在把查詢字符串作為Url地址的一部分進行導航時,如果查詢字符串包含有漢字,需要先進行編碼格式的轉(zhuǎn)換,如:string message=Server.UrlEncode("查詢漢字"),否則將會出現(xiàn)亂碼。使用 Response.Redirect方法既可以導航到當前Web服務器中的資源,又可以導航到其他服務器上的資源,可以導航到任何頁面,沒有站點頁面限制,但不能跳過Web應用程序登錄保護。
Response.Redirect方法主要用于需要將查詢字符串作為Url的一部分傳遞給目標頁面時使用,或者導航到HTML頁面。
3.2.1 Server.Transfer
Server.Transfer方法導航操作發(fā)生在服務器端,服務器將執(zhí)行流程轉(zhuǎn)入同一Web服務器上的另一個aspx頁面進行處理,從而實現(xiàn)了同一Web服務器上aspx頁面間的導航(但不涉及到登錄),同時將頁面的控制權(quán)移交給目標頁面,這時Web服務器并沒有丟棄原始頁面的處理結(jié)果,只是把進行了一半的處理轉(zhuǎn)到目標頁面,其用法如:Server.Transfer("~\WebForm2.aspx")。由于這種導航操作是在服務器端進行的,瀏覽器不知道頁面已經(jīng)發(fā)生了跳轉(zhuǎn),所以導航之后瀏覽器地址欄中的Url地址不變,而頁面內(nèi)容已經(jīng)發(fā)生了變化,但頁面跳轉(zhuǎn)過程中Request、Session等對象保存的信息不變,導航之后可以繼續(xù)使用原始頁面提交的數(shù)據(jù)。Server.Transfer方法直接在服務器端執(zhí)行頁面導航,避免了不必要的網(wǎng)絡(luò)通信,處理速度快,從而獲得了更好的性能和瀏覽效果,但此方法不能導航到其他Web服務器頁面,只能在同一站點下實現(xiàn)頁面導航,而且能夠跳過登錄保護。
為了演示Server.Transfer方法的導航原理,新建一個WebForm1頁面,在WebForm1上添加一個Button1命令按鈕,并將Button1的Text屬性設(shè)置為“導航到WebForm2”,其Button1_Click事件代碼為:Server.Transfer("~\WebForm2.aspx"),如圖1所示。再添加一個WebForm2頁面,在WebForm2上添加一個Label1標簽,并將Label1的Text屬性設(shè)置為“WebForm2頁面”。將WebForm1設(shè)置為起始頁,啟動Web應用程序,單擊WebForm1上的Button1按鈕,可以看到瀏覽器的地址欄和標題均沒有發(fā)生變化,而頁面內(nèi)容已經(jīng)改變,如圖2所示。
圖1 Server.Transfer方法執(zhí)行前頁面
圖2 Server.Transfer方法執(zhí)行后頁面
Server.Transfer方法主要用于需要將執(zhí)行流程轉(zhuǎn)到同一Web服務器上的另一aspx頁面時,其最大的特點是Url仍然是跳轉(zhuǎn)前的頁面的Url地址,跳轉(zhuǎn)后保留了Request和Session對象中的值,可以繼續(xù)使用導航前原始頁面的數(shù)據(jù)。
3.2.2 Server.Execute
Server.Execute方法將執(zhí)行同一Web服務器上的目標頁面,它并沒有打斷Web服務器對原始頁面的處理過程,而是開啟另外一個線程來處理目標頁面,執(zhí)行完畢后不改變原始頁面的位置,捕獲目標頁面的輸出結(jié)果,然后將結(jié)果插入原始頁面的應答流中,最終的效果是將原始頁面和目標頁面兩個頁面的輸出結(jié)果合二為一,或者在原始頁面指定的位置輸出目標頁面的結(jié)果。其用法一:Server.Transfer("~\WebForm2.aspx"),該語句執(zhí)行完畢,將WebForm2頁面的輸出追加到原始頁面的輸出流中。用法二:System.IO.StringWriter WR=new System.IO.StringWriter(),Server.Execute(" ~\WebForm2.aspx",WR),Label1.Text=WR.ToString(),上述三語句執(zhí)行完畢,將WebForm2頁面的輸出結(jié)果在Label1標簽中顯示,采用這種方式使用該方法,可以在原始頁面中方便地調(diào)整目標頁面輸出結(jié)果的位置。Server.Execute方法類似于針對aspx頁面的一次函數(shù)調(diào)用,目標頁面能夠訪問原始頁面的表單數(shù)據(jù)和查詢字符串集合。
為了說明Server.Execute方法的執(zhí)行流程,新建一個WebForm1頁面,在WebForm1上添加一個Label1標簽,并將 Label1的 Text屬性設(shè)置為“WebForm1頁面”,添加一個Button1命令按鈕,并將Button1的Text屬性設(shè)置為“導航到WebForm2”,如圖3所示,其Button1_Click事件處理過程如下:
添加一個WebForm2頁面,在WebForm2上添加一個Label1標簽,并將Label1的Text屬性設(shè)置為“WebForm2頁面”。將WebForm1設(shè)置為起始頁,啟動Web應用程序,單擊WebForm1上的Button1按鈕,WebForm1頁面上Label1標簽的內(nèi)容被替換成WebForm2頁面上Label1標簽的內(nèi)容,如圖4所示。
圖3 Server.Execute方法執(zhí)行前頁面
圖4 Server.Execute方法執(zhí)行后頁面
該方法常用于需要將目標頁面的輸出結(jié)果插入到原始頁面的時候,而且多數(shù)情況下是在表格中將某目標頁面用類似于嵌套的方式插入原始頁面。
(1)標簽和Hyperlink控件在頁面上顯示為超級鏈接,由用戶決定頁面導航的時機。標簽的href屬性和Hyperlink控件的NavigateUrl屬性在服務器端可以通過編程的方式重新設(shè)定,從而實現(xiàn)可動態(tài)變化的超級鏈接。
(2)跨頁面提交技術(shù)利用實現(xiàn)IButtonControl接口的按鈕的PostBackUrl屬性指定導航的目標頁面,只能在同一個站點下實現(xiàn)頁面導航。
(3)Response.Redirect方法瀏覽器要和服務器進行兩次通信,響應速度比較慢,但它可以導航到任何頁面,沒有站點頁面限制。由于它不能跳過Web應用程序登錄保護,導航后原始頁面內(nèi)部控件保存的所有數(shù)據(jù)信息將丟失,因此,需要利用Session、Cookies、Application 等對象進行頁面數(shù)據(jù)的傳遞。
(4)Server.Transfer方法瀏覽器與服務器只進行一次通信,速度較快,但必須在同一站點下進行頁面導航。導航發(fā)生在服務器端,導航后瀏覽器的地址欄仍然保留原始頁面的Url,使用該方法能夠跳過Web應用程序登錄保護。
(5)Sever.Execute方法類似于函數(shù)的一次調(diào)用,原始頁面不會中斷執(zhí)行,而是創(chuàng)建一個新的線程來處理目標頁面,并把目標頁面的輸出結(jié)果返回給原始頁面。該方法也必須在同一站點進行頁面導航。
ASP.NET給我們提供了多種頁面導航方法和技術(shù),在用ASP.NET開發(fā)Web應用程序時,應該在適當?shù)臅r候選擇合適的導航方法和技術(shù),其一般原則如下:
(1)如果要讓用戶來決定何時進行頁面導航以及導航到哪一個頁面,或者要用程序來控制導航的目標,但導航的時機由用戶來決定,超級鏈接最適合。
(2)如果要把用戶導航到另一臺服務器上的資源,或者把用戶導航到非aspx資源,或者要將查詢字符串作為Url的一部分進行傳遞時,使用Response.Redirect方法最適合。
(3)如果要將程序執(zhí)行流程轉(zhuǎn)入同一Web服務器上的另一個aspx頁面,使用Server.Transfer方法最合適,導航操作在服務器上進行,減少了網(wǎng)絡(luò)通信,提高了響應速度,從而能夠獲得更好的性能和瀏覽效果。
(4)如果要捕獲目標頁面的輸出結(jié)果,并將結(jié)果插入原始頁面的特定位置,則應使用Server.Execute方法。
(5)如果要確保HTML輸出的合法性,最好使用Response.Redirect方法,不要使用Server.Transfer或Server.Execute方法,因為Server.Execute或Server.Transfer方法返回給客戶端的頁面包含多個、
標記,不合法的HTML頁面,在有些瀏覽器中可能會發(fā)生錯誤。[1]余金山,林慧,王濤.Asp.NET 3.5網(wǎng)站開發(fā)全程推演與視頻精講[M].北京:電子工業(yè)出版社,2009.
[2]李千目,嚴哲.ASP.NET程序設(shè)計與應用開發(fā)[M].北京:清華大學出版社,2009.
[3]田洪云,ASP.NET頁面跳轉(zhuǎn)方法研究[J].科技信息,2006(12).