ASP.NET 頁面間傳遞參數的方法

來源:互聯網
上載者:User

標籤:style   blog   class   code   java   tar   

 這個新特性意味著ASP.NET2.0開發人員目前有三種可供選擇的技術來將資料從一個web頁面傳送到另外一個頁面。這三種方法是:響應重新導向,服務端傳輸和新的跨網頁提交特性。我們可以已經熟悉前兩種技術了,因此,我們只是簡要地複習一下它們,然後我們會將主要精力放到學習如何使用跨網頁提交特性,以及闡述一下這種方法和響應重新導向以及服務傳輸方式有什麼不同。

 

  一、響應重新導向方法

  響應重新導向方法是目前為止將一個網頁重新導向到另一個網頁的最簡單的方法的最簡單的方法。當Web伺服器接到一個重新導向請求後,它會將一個回應標頭送給用戶端,這將導致用戶端發送一個新的請求到伺服器。按句話說,一個重新導向請求實際上是兩個請求響應:一個是最初的請求響應,另一個是新的重新導向請求響應。

  在ASP.NET中實現重新導向很容易。下面的代碼示範了如何使用Response.Redirect方法實現網頁重新導向:

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

    要注意的是重新導向請求只是一個GET請求,這就意味著我們不能從源頁中通過重新導向命令提交資料。但是我們可以在重新導向中使用查詢字串來傳遞資料。如下面代碼所示:

   protected void Redirect_Click(object sender, EventArgs e)   {            Response.Redirect("menu.aspx?userName=" + UserName.Text));      }  上面的例子將一個查詢字串作為參數傳遞給了Response.Redirect方法的目標URL。我們可以通過如下的代碼獲得來源資料。      protected void Page_Load(object sender, EventArgs e)   {        string userName = Request["userName"];       }

 


      二、伺服器傳輸方法

  和依賴於用戶端向另一個新頁發請求不同,伺服器傳輸是一種伺服器重新導向技術,這種技術通過簡單的改變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。下面的例子示範了如何使用這個屬性。

 

 if ( PreviousPage.IsCrossPagePostBack)   {      //執行代碼  }//******************************************  這個PreviousPage屬性在Server.Transfer和跨網頁提交中都可以使用。在ASP.NET2.0中,我們可以在調用Server.Transfer操作後使用PreviousPage屬性在目標頁面中來獲得源頁面的資料,代碼如下:*******************************************//   {      Server.Transfer("menu.aspx");    }  protected void Redirect_Click(object sender, EventArgs e)  //在這個接收面中我們現在可以獲得Web頁面的資料,代碼如下:   protected void Page_Load(object sender, EventArgs e)   {    if (PreviousPage != null)    {       TextBox txtBox = (TextBox)       PreviousPage.FindControl("txtUserName");        if (textBox != null)       string userName = textBox.Text;        //其他可執行檔代碼    }  }

 

 

  要注意的是上面的代碼必須將txtUserName控制項轉換為TextBox類型,以便可以訪問其中的值。

七、使用PreviousPageType

  PreviousPageType屬性提供了在跨網頁操作中訪問源頁面的強型別能力,下面讓我們示範一下如何不通過任何類型轉換來從源頁面中獲得控制項值。代碼如下:

  < 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”的目標頁。這個目標頁可以使用如下的代碼獲得使用者名稱和密碼:

  八、儲存檢視狀態

  對於跨網頁提交來說,ASP.NET2.0 內嵌了一個叫__POSTBACK的隱藏欄位,這個欄位包含了關於源頁面的視圖資訊 -- 也就是由源頁面提供了,包含了一個帶有一個非空PostBackUrl屬性值的服務端控制項。目標頁可以使用__POSTBACK中的資訊來獲得源頁面的檢視狀態資訊。代碼如下:

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

 

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

  這個跨網頁提交的特性,是ASP.NET2.0中最強有力的特性之一,這種技術將允許在一個頁面中提交到另外一個頁面,並且可以在目標頁面地無縫地操作源頁面中的資料。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.