国产毛片午夜福利,国产黄网,国产亚洲天堂,97国产精品

  •  
    ASP.NET 2.0 中跨網(wǎng)頁提交的三種方法
    發(fā)布時間:2008-04-24   瀏覽次數(shù):1184866

    ASP.NET 2.0 中跨網(wǎng)頁提交的三種方法ASP.NET 2.0 中跨網(wǎng)頁提交的三種方法

    當在一個ASP.NET Web頁面中進行操作時,在默認情況下向當前頁進行提交。

    這種行為在ASP.NET出現(xiàn)之前并沒有什么關(guān)系,但在ASP.NET中當我們想向另外一個Web頁提交一個Web Form時該如何做呢?在ASP.NET1.0中這個問題變得很難解決,但在ASP.NET2.0中為開發(fā)人員提供了更容易的解決的技術(shù):跨網(wǎng)頁提交。這種技術(shù)允許一個網(wǎng)頁在提交數(shù)據(jù)時提交給另外的一個頁面。在跨網(wǎng)頁提交中,用于初始化提交代碼的頁面叫源頁面,而客戶提交的頁面叫目標頁面。

    為了方便起見,目標頁面仍然獲得原頁面提交的所有數(shù)據(jù)。換名話說,從技術(shù)觀點出發(fā),我們可以用同樣的方式處理其他ASP.NET頁面提交的數(shù)據(jù)。

    這個新特性意味著ASP.NET2.0開發(fā)人員目前有三種可供選擇的技術(shù)來將數(shù)據(jù)從一個web頁面?zhèn)魉偷搅硗庖粋頁面。這三種方法是:響應(yīng)重定向,服務(wù)端傳輸和新的跨網(wǎng)頁提交特性。我們可以已經(jīng)熟悉前兩種技術(shù)了,因此,我們只是簡要地復習一下它們,然后我們會將主要精力放到學習如何使用跨網(wǎng)頁提交特性,以及闡述一下這種方法和響應(yīng)重定向以及服務(wù)傳輸方式有什么不同。

    一、響應(yīng)重定向方法

    響應(yīng)重定向方法是目前為止將一個網(wǎng)頁重定向到另一個網(wǎng)頁的最簡單的方法的最簡單的方法。當Web服務(wù)器接到一個重定向請求后,它會將一個響應(yīng)頭送給客戶端,這將導致客戶端發(fā)送一個新的請求到服務(wù)器。按句話說,一個重定向請求實際上是兩個請求響應(yīng):一個是最初的請求響應(yīng),另一個是新的重定向請求響應(yīng)。

    在ASP.NET中實現(xiàn)重定向很容易。下面的代碼演示了如何使用Response.Redirect方法實現(xiàn)網(wǎng)頁重定向:

    protected void Redirect_Click(object sender, EventArgs e)
    {
    Response.Redirect("menu.aspx");
    }

    要注意的是重定向請求只是一個GET請求,這意味著我們不能從源頁中通過重定向命令提交數(shù)據(jù)。但是我們可以在重定向中使用查詢字符串來傳遞數(shù)據(jù)。如下面代碼所示:

    protected void Redirect_Click(object sender, EventArgs e)
    {
    Response.Redirect("menu.aspx?userName=" + UserName.Text));
    }

    上面的例子將一個查詢字符串作為參數(shù)傳遞給了Response.Redirect方法的目標URL。我們可以通過如下的代碼獲得源數(shù)據(jù)。

    protected void Page_Load(object sender, EventArgs e)
    {
    string userName = Request["userName"];
    }

    二、服務(wù)器傳輸方法


    和依賴于客戶端向另一個新頁發(fā)請求不同,服務(wù)器傳輸是一種服務(wù)器重定向技術(shù),這種技術(shù)通過簡單的改變Web服務(wù)器所處理的代碼來達到請求一個新頁的目的。當被請求頁和源頁面在同一個服務(wù)器時,服務(wù)器傳輸要比Response.Redirect方法更有效,這是由于這種技術(shù)可以避免額外的開銷,僅僅使用服務(wù)器的資源可以進行重定向。要注意的這種技術(shù)有一個副作用,在頁面進行重定向時,客戶端的URL仍然會保持源頁面的URL,這可能會使客戶認為他們所獲得的數(shù)據(jù)是源頁面產(chǎn)生的。當然,在大多數(shù)情況下,這不是問題,但是這將使調(diào)試變得更困難。

    Server.Transfer方法還可以保存初始頁的HttpContext。因此,目標頁可以訪問源頁面的值。我們可以使用FormsCollection屬性來從目標頁面中獲得源頁面的值。首先,要確定我們使用了被重載的方法,這個方法有兩個參數(shù):目標URL和一個Boolean類型的值,告訴服務(wù)器是否保存用于描述源頁面值的Form。如下面的代碼所示:

    Server.Transfer("Menu.aspx",true);

    然后,我們在目標頁面中獲得一個叫txtUserName的Textbox控件的值的代碼如下:

    object obj = Request.Form["txtUserName"];

    三、Response.Redirect和Server.Transfer的比較

    由于Response.Redirect方法要進行兩次請求響應(yīng)操作,因此,我們應(yīng)該在對性能要求高的網(wǎng)站盡量避免使用這種方法。然而,只從技術(shù)上說,使用redirect方式確實可以從一個網(wǎng)頁跳到另一個網(wǎng)頁。相比之下,Server.Transfer會更有效率,但是跳轉(zhuǎn)的范圍于同一個Web服務(wù)器的不同網(wǎng)頁。從本質(zhì)上說,我們可以使用Server.Transfer來不必要的請求響應(yīng)操作。如果我們需要重定位到不同服務(wù)器的網(wǎng)頁,需要使用Response.Redirect方法。

    四、跨頁提交概述

    在ASP.NET 2.0中,我們可以通過實現(xiàn)IbuttonControl接口提交給不同的WebForm,來實現(xiàn)跨網(wǎng)頁的提交。和Response.Redirect類似,跨網(wǎng)頁提交是一個基于客戶端的傳輸機制,但也有點象Server.Transfer,目標網(wǎng)頁也可以訪問源網(wǎng)頁的數(shù)據(jù)。為了使用跨網(wǎng)頁提交,我們需要在源網(wǎng)頁中的PostBackUrl屬性中指定目標URL。

    五、實現(xiàn)跨網(wǎng)頁提交

    這部分將討論一下如何在ASP.NET2.0中實現(xiàn)跨網(wǎng)頁提交。為了開始我們的學習,假設(shè)有兩個Web頁,一個是源Web頁,另一個是目標Web頁。在源網(wǎng)頁中初始化了使用按鈕進行的跨網(wǎng)頁提交操作。我們首先必須設(shè)置目標網(wǎng)頁按鈕的PostBackUrl屬性,順便說一句,所有實現(xiàn)了System.Web.UI.WebControls.IbuttonControl接口的Web控件都有跨網(wǎng)頁提交的特性。下面的代碼將演示這一過程。


    <asp:Button ID="btnSubmit" runat="server"
    PostBackUrl="~/target.aspx" text = "Post to a target page"/>

    當我們設(shè)置PostBackUrl屬性時,ASP.NET框架將相應(yīng)的控件綁定到一個新的叫WebForm_DoPostBackWithOptions的JavaScript函數(shù),產(chǎn)生的Html代碼如下:

    <input type="submit" name="btnSubmit" value="Post to target Page"
    onclick="javascript:WebForm_DoPostBackWithOptions(
    new WebForm_PostBackOptions("btnSubmit", "", false, "",
    "Target.aspx", false, false))" id="btnSubmit" />

    對于上面的html代碼來說,當用戶單擊按鈕時,瀏覽器將提交目標URL(Target.aspx),而不是源URL。

    六、從目標頁面中獲得源頁面控件的值

    ASP.NET2.0提供了一個叫PreviousPage的新的屬性,這個屬性無論在何時當前頁面進行跨網(wǎng)頁提交操作時都會指向源頁面。要注意的是,當源頁面和目標頁面在不同的應(yīng)用程序中時,這個屬性包含null(這個null并不是未初始化的意思)。還有要注意的是當目標網(wǎng)頁訪問PreviousPage屬性時可以獲得源頁面的數(shù)據(jù),ASP.NET運行時裝載并執(zhí)行了源頁面。這將引發(fā)ProcessChildRequest事件的發(fā)生。而且,它還會引發(fā)Page_Init事件、Page_Load和任何其他的源頁面按鈕單擊事件。

    因此,我們要避免由于不小心進行誤操作,所以通過IsCrossPostBack屬性來確認是否為一個跨網(wǎng)頁提交發(fā)生,如果這個屬性值為true,那么目標網(wǎng)頁是通過一個跨網(wǎng)頁提交動作而調(diào)用的。如果是通過另外一種方式調(diào)用的(如一般的請求、Response.Redirect或是一個Server.Transfer),這個屬性的值為false。下面的例子演示了如何使用這個屬性。

    if ( PreviousPage.IsCrossPagePostBack)
    {
    //執(zhí)行代碼
    }

    這個PreviousPage屬性在Server.Transfer和跨網(wǎng)頁提交中都可以使用。在ASP.NET2.0中,我們可以在調(diào)用Server.Transfer操作后使用PreviousPage屬性在目標頁面中來獲得源頁面的數(shù)據(jù),代碼如下:

    protected void Redirect_Click(object sender, EventArgs e)
    {
    Server.Transfer("menu.aspx");
    }

    在這個接收面中我們現(xiàn)在可以獲得Web頁面的數(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)換為TextBox類型,以便可以訪問其中的值。

    七、使用PreviousPageType

    PreviousPageType屬性提供了在跨網(wǎng)頁操作中訪問源頁面的強類型能力,下面讓我們演示一下如何不通過任何類型轉(zhuǎn)換來從源頁面中獲得控件值。代碼如下:

    <asp:Textbox ID="txtUserName" Runat="server" />
    <asp:Textbox ID="txtPassword" Runat="server" />
    <asp:Button ID="Submit" Runat="server" Text="Login"
    PostBackUrl="Menu.aspx" />

    要注意的是單擊按鈕可以重定向到一個叫“Menu.asp”的目標頁。這個目標頁可以使用如下的代碼獲得用戶名和密碼:

    <%@ 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屬性返回了一個源頁面的強類型引用,這樣了類型轉(zhuǎn)換。

    八、保存視圖狀態(tài)

    對于跨網(wǎng)頁提交來說,ASP.NET2.0 內(nèi)嵌了一個叫__POSTBACK的隱藏字段,這個字段包含了關(guān)于源頁面的視圖信息 -- 也是由源頁面提供了,包含了一個帶有一個非空PostBackUrl屬性值的服務(wù)端控件。目標頁可以使用__POSTBACK中的信息來獲得源頁面的視圖狀態(tài)信息。代碼如下:

    if(PreviousPage!=null && PreviousPage.IsCrossPagePostBack &&
    PreviousPage.IsValid)
    {
    TextBox txtBox = PreviousPage.FindControl("txtUserName");
    Response.Write(txtBox.Text);
    }

    在上面的代碼中核對了用于確保PreviousPage屬性不為null的檢查代碼。順便提一下,如果目標頁和源頁面不在同一個應(yīng)用程序中,這個PreviousPage屬性的值為null。只有在進行跨網(wǎng)頁提交操作時,IsCrossPagePostBack屬性才為true。

    立即預約