天天看點

一起談.NET技術,在ASP.NET網頁間傳遞資料的五種方法

重點總結

目前為止在ASP.NET網頁中傳遞資料的方式至少有5種:

1、通過查詢字元串傳遞資料。

2、通過HTTP POST傳遞資料。

3、通過會話狀态傳遞資料。

4、通過源頁的公共屬性傳遞資料。

5、通過源頁中的控件值傳遞資料。

到底使用哪種方式來進行資料的傳遞,這可能受到兩方面的影響:

1、頁面重定向的方式。

2、源頁和目标頁是否位于相同的ASP.NET應用程式中。

如果源頁和目标頁位于不同的ASP.NET應用程式中則隻能通過查詢字元串和HTTP POST傳遞資料。

而如果源頁和目标頁位于相同的ASP.NET應用程式中,則可以使用五種方式中的任意一種。

一、通過查詢字元串傳遞資料

下面的兩個URL,第一個隻傳遞了産品編号,第二個不僅傳遞了産品編号,同時也傳遞産品名稱。

<a href="http://localhost/Demo/DestinationPage.aspx?ProductID=777">http://localhost/Demo/DestinationPage.aspx?ProductID=777</a>

<a href="http://localhost/Demo/DestinationPage.aspx?ProductID=777&amp;ProductName=Glass">http://localhost/Demo/DestinationPage.aspx?ProductID=777&amp;ProductName=Glass</a>

在目标頁中則可以通過Page.Request.QueryString屬性來擷取查詢字元串中傳遞的鍵值。比如下面的代碼:

二、通過HTTP POST傳遞資料

此示例代碼在源頁中,為使用者提供了輸入使用者名、生日和年齡的文本框,并且将Button控件的PostBackUrl屬性設定為DestinationPage.aspx。也就是說當單擊【送出到目标頁】按鈕後,源頁窗體的資料會被傳遞到DestinationPage.aspx頁面。

在目标頁中則通過Page.Request.Form屬性來擷取這些傳遞過來的資料。

源頁的頁面源碼如下:

目标頁中擷取源頁窗體資料的代碼如下:

代碼中的if語句主要是為了避免擷取以兩個下劃線__開頭的隐藏字段的資料,比如__VIEWSTATE、__EVENTTARGET、__EVENTARGUMENT。當然也可以去掉這個if語句,然後就能同時擷取這些隐藏字段的資料了。

三、通過會話狀态傳遞資料

使用會話狀态的好處是可以在與源頁處于相同ASP.NET應用程式的所有網頁間共享資料。缺點是會增加伺服器的記憶體開銷。

下面的代碼中,使用者在源頁的【使用者名】文本框中輸入自己的姓名,然後單擊【送出資料】按鈕。伺服器代碼會通過Page.Session屬性将使用者名存儲到會話狀态中,然後使用Response.Redirect()方法将頁面強制重定向到另外一個頁面(DestinationPage.aspx)。在這個目标頁面中再次通過Page.Session屬性來擷取使用者在源頁中儲存的使用者名。

源頁的源代碼如下:

源頁中用來儲存使用者名到會話狀态并重定向到目标頁的代碼如下:

目标頁中擷取儲存在會話狀态中的使用者名的代碼如下:

四、通過源頁的公共屬性傳遞資料

在示例代碼中,我們在源頁中提供了一個輸入使用者名的文本框,然後通過單擊【送出到目标頁】按鈕将資料送出到目标頁。

并且為源頁定義了一個名為UserName的公共屬性,此屬性傳回的是【使用者名】文本框中輸入的使用者名。

這樣我們就建立了一個包含公共屬性的源頁。接着建立目标頁,并且為目标頁添加@PreviousPageType指令,當然也可以使用@Reference指令。

這樣,ASP.NET就會自動将目标頁的Page.PreviousPage屬性轉換為源頁的類型,進而就可以直接通路UserName屬性。注意觀察下面的代碼,我們并沒有将Page.PreviousPage進行顯示的類型轉換。

需要特别強調的是不要忘記判斷Page.PreviousPage屬性是否為null,因為它确實有為null的可能性。如果在為null的情況下擷取UserName這個源頁的公共屬性,那是會跳出異常的。

五、通過源頁中的控件值傳遞資料

這最後一種傳遞資料的方式就是直接擷取源頁的控件對象了,然後通過控件的屬性值來擷取所需的資料。比如本示例代碼中,我們就是通過擷取源頁的TextBox控件,然後通過通路TextBox.Text屬性來擷取使用者在源頁中輸入的資料。

下面的示例代碼中,我們在源頁放置了一個輸入使用者名的文本框,ID為UserNameTextBox。通過Page.PreviousPage.FindControl()方法就可以擷取此控件的引用。

目标頁中擷取文本框控件,并擷取其Text屬性值的代碼如下:

如果所要擷取的控件位于某個控件的内部,比如下面的代碼,UserNameTextBox控件位于名為UserPanel的Panel控件内部。那麼首先找出這個Panel控件,然後通過此控件的FindControl()方法找出内部的文本框控件。

目标頁中擷取這個位于Panel控件内部的TextBox控件的代碼如下:

不管控件位于那個級别的命名容器控件内部,都是通過這種方式來擷取的。

一定不要忘記判斷所擷取的控件引用是否為null。

到這裡為止,5種在網頁間傳遞資料的方式基本已經展示完畢!^_^

光腳丫思考 2010-11-9

繼續閱讀