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