熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET 2.0 中跨網頁提交的三種方法

2013-11-13 10:12:46  來源: .NET編程 

  當在一個ASPNET Web頁面中進行操作時在默認情況下向當前頁進行提交這種行為在ASPNET出現之前並沒有什麼關系但在ASPNET中當我們想向另外一個Web頁提交一個Web Form時該如何做呢?在ASPNET中這個問題變得很難解決但在ASPNET中為開發人員提供了更容易的解決的技術跨網頁提交這種技術允許一個網頁在提交數據時提交給另外的一個頁面在跨網頁提交中用於初始化提交代碼的頁面叫源頁面而客戶提交的頁面叫目標頁面

  為了方便起見目標頁面仍然獲得原頁面提交的所有數據換名話說從技術觀點出發我們可以用同樣的方式處理其他ASPNET頁面提交的數據

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

  一響應重定向方法

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

  在ASPNET中實現重定向很容易下面的代碼演示了如何使用ResponseRedirect方法實現網頁重定向

  protected void Redirect_Click(object sender EventArgs e)

  {

  ResponseRedirect(menuaspx);

  }

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

  protected void Redirect_Click(object sender EventArgs e)

  {

  ResponseRedirect(menuaspx?userName= + UserNameText));

  }

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

  

  protected void Page_Load(object sender EventArgs e)
   
  {

  string userName = Request[userName];

  }

  二服務器傳輸方法

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

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

  [NextPage]
   ServerTransfer(Menuaspxtrue);
  然後我們在目標頁面中獲得一個叫txtUserName的Textbox控件的值的代碼如下

  object obj = RequestForm[txtUserName];
  三ResponseRedirect和ServerTransfer的比較

  由於ResponseRedirect方法要進行兩次請求響應操作因此我們應該在對性能要求高的網站盡量避免使用這種方法然而只從技術上說使用redirect方式確實可以從一個網頁跳到另一個網頁相比之下ServerTransfer會更有效率但是跳轉的范圍僅限於同一個Web服務器的不同網頁從本質上說我們可以使用ServerTransfer來消除不必要的請求響應操作如果我們需要重定位到不同服務器的網頁就需要使用ResponseRedirect方法

  四跨頁提交概述

  在ASPNET 我們可以通過實現IbuttonControl接口提交給不同的WebForm來實現跨網頁的提交和ResponseRedirect類似跨網頁提交是一個基於客戶端的傳輸機制但也有點象ServerTransfer目標網頁也可以訪問源網頁的數據為了使用跨網頁提交我們需要在源網頁中的PostBackUrl屬性中指定目標URL

  五實現跨網頁提交

  這部分將討論一下如何在ASPNET中實現跨網頁提交為了開始我們的學習假設有兩個Web頁一個是源Web頁另一個是目標Web頁在源網頁中初始化了使用按鈕進行的跨網頁提交操作我們首先必須設置目標網頁按鈕的PostBackUrl屬性順便說一句所有實現了SystemWebUIWebControlsIbuttonControl接口的Web控件都有跨網頁提交的特性下面的代碼將演示這一過程

  PostBackUrl=~/targetaspx text = Post to a target page/>
  當我們設置PostBackUrl屬性時ASPNET框架將相應的控件綁定到一個新的叫WebForm_DoPostBackWithOptions的JavaScript函數產生的Html代碼如下

  onclick=javascript:WebForm_DoPostBackWithOptions(
  new WebForm_PostBackOptions(btnSubmit false

  Targetaspx false false)) id=btnSubmit />

  對於上面的html代碼來說當用戶單擊按鈕時浏覽器將提交目標URL(Targetaspx)而不是源URL

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

  ASPNET提供了一個叫PreviousPage的新的屬性這個屬性無論在何時當前頁面進行跨網頁提交操作時都會指向源頁面要注意的是當源頁面和目標頁面在不同的應用程序中時這個屬性包含null(這個null並不是未初始化的意思)還有要注意的是當目標網頁訪問PreviousPage屬性時可以獲得源頁面的數據ASPNET運行時裝載並執行了源頁面這將引發ProcessChildRequest事件的發生而且它還會引發Page_Init事件Page_Load和任何其他的源頁面按鈕單擊事件

  因此我們要避免由於不小心進行誤操作所以最好通過IsCrossPostBack屬性來確認是否為一個跨網頁提交發生如果這個屬性值為true那麼目標網頁就是通過一個跨網頁提交動作而調用的如果是通過另外一種方式調用的(如一般的請求ResponseRedirect或是一個ServerTransfer)這個屬性的值為false下面的例子演示了如何使用這個屬性

  if ( PreviousPageIsCrossPagePostBack)
  {

  //執行代碼

  }[NextPage]

  這個PreviousPage屬性在ServerTransfer和跨網頁提交中都可以使用在ASPNET我們可以在調用ServerTransfer操作後使用PreviousPage屬性在目標頁面中來獲得源頁面的數據代碼如下:

  {
  ServerTransfer(menuaspx);

  }

  protected void Redirect_Click(object sender EventArgs e)

  在這個接收面中我們現在可以獲得Web頁面的數據代碼如下

  protected void Page_Load(object sender EventArgs e)
  {

  if (PreviousPage != null)

  {

  TextBox txtBox = (TextBox)

  PreviousPageFindControl(txtUserName);

  if (textBox != null)

  string userName = textBoxText;

  //其他可執行的代碼

  }

  }

  要注意的是上面的代碼必須將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=Menuaspx />

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

  八保存視圖狀態

  對於跨網頁提交來說ASPNET 內嵌了一個叫__POSTBACK的隱藏字段這個字段包含了關於源頁面的視圖信息 也就是由源頁面提供了包含了一個帶有一個非空PostBackUrl屬性值的服務端控件目標頁可以使用__POSTBACK中的信息來獲得源頁面的視圖狀態信息代碼如下

  if(PreviousPage!=null && PreviousPageIsCrossPagePostBack &&

  PreviousPageIsValid)

  {

  TextBox txtBox = PreviousPageFindControl(txtUserName);

  ResponseWrite(txtBoxText);

  }

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

  這個跨網頁提交的特性是ASPNET中最強有力的特性之一這種技術將允許在一個頁面中提交到另外一個頁面並且可以在目標頁面地無縫地操作源頁面中的數據


From:http://tw.wingwit.com/Article/program/net/201311/12923.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.