這個新特性意味着asp.net2.0開發人員目前有三種可供選擇的技術來将資料從一個web頁面傳送到另外一個頁面。這三種方法是:響應重定向,服務端傳輸和新的跨網頁送出特性。我們可以已經熟悉前兩種技術了,是以,我們隻是簡要地複習一下它們,然後我們會将主要精力放到學習如何使用跨網頁送出特性,以及闡述一下這種方法和響應重定向以及服務傳輸方式有什麼不同。
一、響應重定向方法
響應重定向方法是目前為止将一個網頁重定向到另一個網頁的最簡單的方法的最簡單的方法。當web伺服器接到一個重定向請求後,它會将一個響應頭送給用戶端,這将導緻用戶端發送一個新的請求到伺服器。按句話說,一個重定向請求實際上是兩個請求響應:一個是最初的請求響應,另一個是新的重定向請求響應。
在asp.net中實作重定向很容易。下面的代碼示範了如何使用response.redirect方法實作網頁重定向:
要注意的是重定向請求隻是一個get請求,這就意味着我們不能從源頁中通過重定向指令送出資料。但是我們可以在重定向中使用查詢字元串來傳遞資料。如下面代碼所示:
二、伺服器傳輸方法
和依賴于用戶端向另一個新頁發請求不同,伺服器傳輸是一種伺服器重定向技術,這種技術通過簡單的改變web伺服器所處理的代碼來達到請求一個新頁的目的。當被請求頁和源頁面在同一個伺服器時,伺服器傳輸要比response.redirect方法更有效,這是由于這種技術可以避免額外的開銷,僅僅使用伺服器的資源就可以進行重定向。要注意的這種技術有一個副作用,在頁面進行重定向時,用戶端的url仍然會保持源頁面的url,這可能會使客戶認為他們所獲得的資料是源頁面産生的。當然,在大多數情況下,這不是問題,但是這将使調試變得更困難。
server.transfer方法還可以儲存初始頁的httpcontext。是以,目标頁可以通路源頁面的值。我們可以使用formscollection屬性來從目标頁面中獲得源頁面的值。首先,要确定我們使用了被重載的方法,這個方法有兩個參數:目标url和一個boolean類型的值,告訴伺服器是否儲存用于描述源頁面值的form。如下面的代碼所示:
server.transfer("menu.aspx",true);
然後,我們在目标頁面中獲得一個叫txtusername的textbox控件的值的代碼如下:
object obj =
request.form["txtusername"];
三、response.redirect和server.transfer的比較
由于response.redirect方法要進行兩次請求響應操作,是以,我們應該在對性能要求高的網站盡量避免使用這種方法。然而,隻從技術上說,使用redirect方式确實可以從一個網頁跳到另一個網頁。相比之下,server.transfer會更有效率,但是跳轉的範圍僅限于同一個web伺服器的不同網頁。從本質上說,我們可以使用server.transfer來消除不必要的請求響應操作。如果我們需要重定位到不同伺服器的網頁,就需要使用response.redirect方法。
四、跨頁送出概述
在asp.net
2.0中,我們可以通過實作ibuttoncontrol接口送出給不同的webform,來實作跨網頁的送出。和response.redirect類似,跨網頁送出是一個基于用戶端的傳輸機制,但也有點象server.transfer,目标網頁也可以通路源網頁的資料。為了使用跨網頁送出,我們需要在源網頁中的postbackurl屬性中指定目标url。
五、實作跨網頁送出
這部分将讨論一下如何在asp.net2.0中實作跨網頁送出。為了開始我們的學習,假設有兩個web頁,一個是源web頁,另一個是目标web頁。在源網頁中初始化了使用按鈕進行的跨網頁送出操作。我們首先必須設定目标網頁按鈕的postbackurl屬性,順便說一句,所有實作了system.web.ui.webcontrols.ibuttoncontrol接口的web控件都有跨網頁送出的特性。下面的代碼将示範這一過程。
postbackurl="~/target.aspx" text =
"post to a target
page"/>
當我們設定postbackurl屬性時,asp.net架構将相應的控件綁定到一個新的叫webform_dopostbackwithoptions的javascript函數,産生的html代碼如下:
onclick="javascript:webform_dopostbackwithoptions(new
webform_postbackoptions("btnsubmit", "", false, "","target.aspx",
false, false))" id="btnsubmit" />
對于上面的html代碼來說,當使用者單擊按鈕時,浏覽器将送出目标url(target.aspx),而不是源url。
六、從目标頁面中獲得源頁面控件的值
asp.net2.0提供了一個叫previouspage的新的屬性,這個屬性無論在何時目前頁面進行跨網頁送出操作時都會指向源頁面。要注意的是,當源頁面和目标頁面在不同的應用程式中時,這個屬性包含null(這個null并不是未初始化的意思)。還有要注意的是當目标網頁通路previouspage屬性時可以獲得源頁面的資料,asp.net運作時裝載并執行了源頁面。這将引發processchildrequest事件的發生。而且,它還會引發page_init事件、page_load和任何其他的源頁面按鈕單擊事件。
是以,我們要避免由于不小心進行誤操作,是以最好通過iscrosspostback屬性來确認是否為一個跨網頁送出發生,如果這個屬性值為true,那麼目标網頁就是通過一個跨網頁送出動作而調用的。如果是通過另外一種方式調用的(如一般的請求、response.redirect或是一個server.transfer),這個屬性的值為false。下面的例子示範了如何使用這個屬性。
要注意的是上面的代碼必須将txtusername控件轉換為textbox類型,以便可以通路其中的值。
七、使用previouspagetype
previouspagetype屬性提供了在跨網頁操作中通路源頁面的強類型能力,下面讓我們示範一下如何不通過任何類型轉換來從源頁面中獲得控件值。代碼如下:
要注意的是單擊按鈕可以重定向到一個叫“menu.asp”的目标頁。這個目标頁可以使用如下的代碼獲得使用者名和密碼:
八、儲存視圖狀态
對于跨網頁送出來說,asp.net2.0
内嵌了一個叫__postback的隐藏字段,這個字段包含了關于源頁面的視圖資訊 --
也就是由源頁面提供了,包含了一個帶有一個非空postbackurl屬性值的服務端控件。目标頁可以使用__postback中的資訊來獲得源頁面的視圖狀态資訊。代碼如下:
在上面的代碼中核對了用于確定previouspage屬性不為null的檢查代碼。順便提一下,如果目标頁和源頁面不在同一個應用程式中,這個previouspage屬性的值為null。隻有在進行跨網頁送出操作時,iscrosspagepostback屬性才為true。
這個跨網頁送出的特性,是asp.net2.0中最強有力的特性之一,這種技術将允許在一個頁面中送出到另外一個頁面,并且可以在目标頁面地無縫地操作源頁面中的資料。