- TEL:131 7970 3111
-
慧網(wǎng)微信
- 掃描二維碼
- 關(guān)注邳州在線
-
手機(jī)網(wǎng)站
- 手機(jī)掃描二維碼
- 進(jìn)入手機(jī)站
網(wǎng)站地圖
付款方式
ASP.NET 2.0 中跨網(wǎng)頁(yè)提交的三種方法ASP.NET 2.0 中跨網(wǎng)頁(yè)提交的三種方法
當(dāng)在一個(gè)ASP.NET Web頁(yè)面中進(jìn)行操作時(shí),在默認(rèn)情況下向當(dāng)前頁(yè)進(jìn)行提交。
這種行為在ASP.NET出現(xiàn)之前并沒(méi)有什么關(guān)系,但在ASP.NET中當(dāng)我們想向另外一個(gè)Web頁(yè)提交一個(gè)Web Form時(shí)該如何做呢?在ASP.NET1.0中這個(gè)問(wèn)題變得很難解決,但在ASP.NET2.0中為開(kāi)發(fā)人員提供了更容易的解決的技術(shù):跨網(wǎng)頁(yè)提交。這種技術(shù)允許一個(gè)網(wǎng)頁(yè)在提交數(shù)據(jù)時(shí)提交給另外的一個(gè)頁(yè)面。在跨網(wǎng)頁(yè)提交中,用于初始化提交代碼的頁(yè)面叫源頁(yè)面,而客戶(hù)提交的頁(yè)面叫目標(biāo)頁(yè)面。
為了方便起見(jiàn),目標(biāo)頁(yè)面仍然獲得原頁(yè)面提交的所有數(shù)據(jù)。換名話說(shuō),從技術(shù)觀點(diǎn)出發(fā),我們可以用同樣的方式處理其他ASP.NET頁(yè)面提交的數(shù)據(jù)。
這個(gè)新特性意味著ASP.NET2.0開(kāi)發(fā)人員目前有三種可供選擇的技術(shù)來(lái)將數(shù)據(jù)從一個(gè)web頁(yè)面?zhèn)魉偷搅硗庖粋(gè)頁(yè)面。這三種方法是:響應(yīng)重定向,服務(wù)端傳輸和新的跨網(wǎng)頁(yè)提交特性。我們可以已經(jīng)熟悉前兩種技術(shù)了,因此,我們只是簡(jiǎn)要地復(fù)習(xí)一下它們,然后我們會(huì)將主要精力放到學(xué)習(xí)如何使用跨網(wǎng)頁(yè)提交特性,以及闡述一下這種方法和響應(yīng)重定向以及服務(wù)傳輸方式有什么不同。
一、響應(yīng)重定向方法
響應(yīng)重定向方法是目前為止將一個(gè)網(wǎng)頁(yè)重定向到另一個(gè)網(wǎng)頁(yè)的最簡(jiǎn)單的方法的最簡(jiǎn)單的方法。當(dāng)Web服務(wù)器接到一個(gè)重定向請(qǐng)求后,它會(huì)將一個(gè)響應(yīng)頭送給客戶(hù)端,這將導(dǎo)致客戶(hù)端發(fā)送一個(gè)新的請(qǐng)求到服務(wù)器。按句話說(shuō),一個(gè)重定向請(qǐng)求實(shí)際上是兩個(gè)請(qǐng)求響應(yīng):一個(gè)是最初的請(qǐng)求響應(yīng),另一個(gè)是新的重定向請(qǐng)求響應(yīng)。
在ASP.NET中實(shí)現(xiàn)重定向很容易。下面的代碼演示了如何使用Response.Redirect方法實(shí)現(xiàn)網(wǎng)頁(yè)重定向:
protected void Redirect_Click(object sender, EventArgs e) { Response.Redirect("menu.aspx"); } |
要注意的是重定向請(qǐng)求只是一個(gè)GET請(qǐng)求,這意味著我們不能從源頁(yè)中通過(guò)重定向命令提交數(shù)據(jù)。但是我們可以在重定向中使用查詢(xún)字符串來(lái)傳遞數(shù)據(jù)。如下面代碼所示:
protected void Redirect_Click(object sender, EventArgs e) |
上面的例子將一個(gè)查詢(xún)字符串作為參數(shù)傳遞給了Response.Redirect方法的目標(biāo)URL。我們可以通過(guò)如下的代碼獲得源數(shù)據(jù)。
protected void Page_Load(object sender, EventArgs e) |
二、服務(wù)器傳輸方法
和依賴(lài)于客戶(hù)端向另一個(gè)新頁(yè)發(fā)請(qǐng)求不同,服務(wù)器傳輸是一種服務(wù)器重定向技術(shù),這種技術(shù)通過(guò)簡(jiǎn)單的改變Web服務(wù)器所處理的代碼來(lái)達(dá)到請(qǐng)求一個(gè)新頁(yè)的目的。當(dāng)被請(qǐng)求頁(yè)和源頁(yè)面在同一個(gè)服務(wù)器時(shí),服務(wù)器傳輸要比Response.Redirect方法更有效,這是由于這種技術(shù)可以避免額外的開(kāi)銷(xiāo),僅僅使用服務(wù)器的資源可以進(jìn)行重定向。要注意的這種技術(shù)有一個(gè)副作用,在頁(yè)面進(jìn)行重定向時(shí),客戶(hù)端的URL仍然會(huì)保持源頁(yè)面的URL,這可能會(huì)使客戶(hù)認(rèn)為他們所獲得的數(shù)據(jù)是源頁(yè)面產(chǎn)生的。當(dāng)然,在大多數(shù)情況下,這不是問(wèn)題,但是這將使調(diào)試變得更困難。
Server.Transfer方法還可以保存初始頁(yè)的HttpContext。因此,目標(biāo)頁(yè)可以訪問(wèn)源頁(yè)面的值。我們可以使用FormsCollection屬性來(lái)從目標(biāo)頁(yè)面中獲得源頁(yè)面的值。首先,要確定我們使用了被重載的方法,這個(gè)方法有兩個(gè)參數(shù):目標(biāo)URL和一個(gè)Boolean類(lèi)型的值,告訴服務(wù)器是否保存用于描述源頁(yè)面值的Form。如下面的代碼所示:
Server.Transfer("Menu.aspx",true);
然后,我們?cè)谀繕?biāo)頁(yè)面中獲得一個(gè)叫txtUserName的Textbox控件的值的代碼如下:
object obj = Request.Form["txtUserName"];
三、Response.Redirect和Server.Transfer的比較
由于Response.Redirect方法要進(jìn)行兩次請(qǐng)求響應(yīng)操作,因此,我們應(yīng)該在對(duì)性能要求高的網(wǎng)站盡量避免使用這種方法。然而,只從技術(shù)上說(shuō),使用redirect方式確實(shí)可以從一個(gè)網(wǎng)頁(yè)跳到另一個(gè)網(wǎng)頁(yè)。相比之下,Server.Transfer會(huì)更有效率,但是跳轉(zhuǎn)的范圍于同一個(gè)Web服務(wù)器的不同網(wǎng)頁(yè)。從本質(zhì)上說(shuō),我們可以使用Server.Transfer來(lái)不必要的請(qǐng)求響應(yīng)操作。如果我們需要重定位到不同服務(wù)器的網(wǎng)頁(yè),需要使用Response.Redirect方法。
四、跨頁(yè)提交概述
在ASP.NET 2.0中,我們可以通過(guò)實(shí)現(xiàn)IbuttonControl接口提交給不同的WebForm,來(lái)實(shí)現(xiàn)跨網(wǎng)頁(yè)的提交。和Response.Redirect類(lèi)似,跨網(wǎng)頁(yè)提交是一個(gè)基于客戶(hù)端的傳輸機(jī)制,但也有點(diǎn)象Server.Transfer,目標(biāo)網(wǎng)頁(yè)也可以訪問(wèn)源網(wǎng)頁(yè)的數(shù)據(jù)。為了使用跨網(wǎng)頁(yè)提交,我們需要在源網(wǎng)頁(yè)中的PostBackUrl屬性中指定目標(biāo)URL。
五、實(shí)現(xiàn)跨網(wǎng)頁(yè)提交
這部分將討論一下如何在ASP.NET2.0中實(shí)現(xiàn)跨網(wǎng)頁(yè)提交。為了開(kāi)始我們的學(xué)習(xí),假設(shè)有兩個(gè)Web頁(yè),一個(gè)是源Web頁(yè),另一個(gè)是目標(biāo)Web頁(yè)。在源網(wǎng)頁(yè)中初始化了使用按鈕進(jìn)行的跨網(wǎng)頁(yè)提交操作。我們首先必須設(shè)置目標(biāo)網(wǎng)頁(yè)按鈕的PostBackUrl屬性,順便說(shuō)一句,所有實(shí)現(xiàn)了System.Web.UI.WebControls.IbuttonControl接口的Web控件都有跨網(wǎng)頁(yè)提交的特性。下面的代碼將演示這一過(guò)程。
<asp:Button ID="btnSubmit" runat="server" |
當(dāng)我們?cè)O(shè)置PostBackUrl屬性時(shí),ASP.NET框架將相應(yīng)的控件綁定到一個(gè)新的叫WebForm_DoPostBackWithOptions的JavaScript函數(shù),產(chǎn)生的Html代碼如下:
<input type="submit" name="btnSubmit" value="Post to target Page" |
對(duì)于上面的html代碼來(lái)說(shuō),當(dāng)用戶(hù)單擊按鈕時(shí),瀏覽器將提交目標(biāo)URL(Target.aspx),而不是源URL。
六、從目標(biāo)頁(yè)面中獲得源頁(yè)面控件的值
ASP.NET2.0提供了一個(gè)叫PreviousPage的新的屬性,這個(gè)屬性無(wú)論在何時(shí)當(dāng)前頁(yè)面進(jìn)行跨網(wǎng)頁(yè)提交操作時(shí)都會(huì)指向源頁(yè)面。要注意的是,當(dāng)源頁(yè)面和目標(biāo)頁(yè)面在不同的應(yīng)用程序中時(shí),這個(gè)屬性包含null(這個(gè)null并不是未初始化的意思)。還有要注意的是當(dāng)目標(biāo)網(wǎng)頁(yè)訪問(wèn)PreviousPage屬性時(shí)可以獲得源頁(yè)面的數(shù)據(jù),ASP.NET運(yùn)行時(shí)裝載并執(zhí)行了源頁(yè)面。這將引發(fā)ProcessChildRequest事件的發(fā)生。而且,它還會(huì)引發(fā)Page_Init事件、Page_Load和任何其他的源頁(yè)面按鈕單擊事件。
因此,我們要避免由于不小心進(jìn)行誤操作,所以通過(guò)IsCrossPostBack屬性來(lái)確認(rèn)是否為一個(gè)跨網(wǎng)頁(yè)提交發(fā)生,如果這個(gè)屬性值為true,那么目標(biāo)網(wǎng)頁(yè)是通過(guò)一個(gè)跨網(wǎng)頁(yè)提交動(dòng)作而調(diào)用的。如果是通過(guò)另外一種方式調(diào)用的(如一般的請(qǐng)求、Response.Redirect或是一個(gè)Server.Transfer),這個(gè)屬性的值為false。下面的例子演示了如何使用這個(gè)屬性。
if ( PreviousPage.IsCrossPagePostBack)
{
//執(zhí)行代碼
}
這個(gè)PreviousPage屬性在Server.Transfer和跨網(wǎng)頁(yè)提交中都可以使用。在ASP.NET2.0中,我們可以在調(diào)用Server.Transfer操作后使用PreviousPage屬性在目標(biāo)頁(yè)面中來(lái)獲得源頁(yè)面的數(shù)據(jù),代碼如下:
protected void Redirect_Click(object sender, EventArgs e) { Server.Transfer("menu.aspx"); } |
在這個(gè)接收面中我們現(xiàn)在可以獲得Web頁(yè)面的數(shù)據(jù),代碼如下:
protected void Page_Load(object sender, EventArgs e) { if (PreviousPage != null) { TextBox txtBox = (TextBox) PreviousPage.FindControl("txtUserName"); if (textBox != null) string userName = textBox.Text; //其他可執(zhí)行的代碼 } } |
要注意的是上面的代碼必須將txtUserName控件轉(zhuǎn)換為T(mén)extBox類(lèi)型,以便可以訪問(wèn)其中的值。
七、使用PreviousPageType
PreviousPageType屬性提供了在跨網(wǎng)頁(yè)操作中訪問(wèn)源頁(yè)面的強(qiáng)類(lèi)型能力,下面讓我們演示一下如何不通過(guò)任何類(lèi)型轉(zhuǎn)換來(lái)從源頁(yè)面中獲得控件值。代碼如下:
<asp:Textbox ID="txtUserName" Runat="server" />
<asp:Textbox ID="txtPassword" Runat="server" />
<asp:Button ID="Submit" Runat="server" Text="Login"
PostBackUrl="Menu.aspx" />
要注意的是單擊按鈕可以重定向到一個(gè)叫“Menu.asp”的目標(biāo)頁(yè)。這個(gè)目標(biāo)頁(yè)可以使用如下的代碼獲得用戶(hù)名和密碼:
<%@ PreviousPageType VirtualPath="~/Login.aspx" %> <script runat="server"> protected void Page_Load(object sender, System.EventArgs e) { String userName = PreviousPage.txtUserName.Text; String password = PreviousPage.txtPassword.Text; //其他可執(zhí)行代碼 } |
在上面的代碼中,PreviousPageType屬性返回了一個(gè)源頁(yè)面的強(qiáng)類(lèi)型引用,這樣了類(lèi)型轉(zhuǎn)換。
八、保存視圖狀態(tài)
對(duì)于跨網(wǎng)頁(yè)提交來(lái)說(shuō),ASP.NET2.0 內(nèi)嵌了一個(gè)叫__POSTBACK的隱藏字段,這個(gè)字段包含了關(guān)于源頁(yè)面的視圖信息 -- 也是由源頁(yè)面提供了,包含了一個(gè)帶有一個(gè)非空PostBackUrl屬性值的服務(wù)端控件。目標(biāo)頁(yè)可以使用__POSTBACK中的信息來(lái)獲得源頁(yè)面的視圖狀態(tài)信息。代碼如下:
if(PreviousPage!=null && PreviousPage.IsCrossPagePostBack && PreviousPage.IsValid) { TextBox txtBox = PreviousPage.FindControl("txtUserName"); Response.Write(txtBox.Text); } |
在上面的代碼中核對(duì)了用于確保PreviousPage屬性不為null的檢查代碼。順便提一下,如果目標(biāo)頁(yè)和源頁(yè)面不在同一個(gè)應(yīng)用程序中,這個(gè)PreviousPage屬性的值為null。只有在進(jìn)行跨網(wǎng)頁(yè)提交操作時(shí),IsCrossPagePostBack屬性才為true。