在ASP.NET網頁間傳遞數據的五種方法
重點總結
目前為止在ASP.NET網頁中傳遞數據的方式至少有5種:
1、通過查詢字符串傳遞數據。
2、通過HTTP POST傳遞數據。
3、通過會話狀態傳遞數據。
4、通過源頁的公共屬性傳遞數據。
5、通過源頁中的控件值傳遞數據。
到底使用哪種方式來進行數據的傳遞,這可能受到兩方面的影響:
1、頁面重定向的方式。
2、源頁和目標頁是否位于相同的ASP.NET應用程序中。
如果源頁和目標頁位于不同的ASP.NET應用程序中則只能通過查詢字符串和HTTP POST傳遞數據。
而如果源頁和目標頁位于相同的ASP.NET應用程序中,則可以使用五種方式中的任意一種。
一、通過查詢字符串傳遞數據
下面的兩個URL,第一個只傳遞了產品編號,第二個不僅傳遞了產品編號,同時也傳遞產品名稱。
http://localhost/Demo/DestinationPage.aspx?ProductID=777
http://localhost/Demo/DestinationPage.aspx?ProductID=777&ProductName=Glass
在目標頁中則可以通過Page.Request.QueryString屬性來獲取查詢字符串中傳遞的鍵值。比如下面的代碼:
this.Response.Write(this.Request.QueryString["ProductID"]); this.Response.Write("<br />"); this.Response.Write(string.Format("ProductID={0} ProductName={1}", this.Request.QueryString["ProductID"], this.Request.QueryString["ProductName"]));
二、通過HTTP POST傳遞數據
此示例代碼在源頁中,為用戶提供了輸入用戶名、生日和年齡的文本框,并且將Button控件的PostBackUrl屬性設置為DestinationPage.aspx。也就是說當單擊【提交到目標頁】按鈕后,源頁窗體的數據會被傳遞到DestinationPage.aspx頁面。
在目標頁中則通過Page.Request.Form屬性來獲取這些傳遞過來的數據。
源頁的頁面源碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>源頁!</title> </head> <body> <form id="form1" runat="server"> <div> User Name : <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> <br /> Birth Date : <asp:TextBox ID="BirthDateTextBox" runat="server"></asp:TextBox> <br /> Age : <asp:TextBox ID="AgeTextBox" runat="server"></asp:TextBox> <br /> <asp:Button ID="SubmitButton" runat="server" Text="提交到目標頁" PostBackUrl="~/DestinationPage.aspx" /> </div> </form> </body> </html>
目標頁中獲取源頁窗體數據的代碼如下:
protected void Page_Load(object sender, EventArgs e) { StringBuilder SBuilder = new StringBuilder(); NameValueCollection PostedValues = this.Request.Form; for (int Index = 0; Index < PostedValues.Count; Index++) { if (PostedValues.Keys[Index].Substring(0, 2) != "__") { SBuilder.Append(string.Format("{0} = {1}", PostedValues.Keys[Index], PostedValues[Index])); SBuilder.Append("<br />"); } } this.Response.Write(SBuilder.ToString()); }
代碼中的if語句主要是為了避免獲取以兩個下劃線__開頭的隱藏字段的數據,比如__VIEWSTATE、__EVENTTARGET、__EVENTARGUMENT。當然也可以去掉這個if語句,然后就能同時獲取這些隱藏字段的數據了。
三、通過會話狀態傳遞數據
使用會話狀態的好處是可以在與源頁處于相同ASP.NET應用程序的所有網頁間共享數據。缺點是會增加服務器的內存開銷。
下面的代碼中,用戶在源頁的【用戶名】文本框中輸入自己的姓名,然后單擊【提交數據】按鈕。服務器代碼會通過Page.Session屬性將用戶名存儲到會話狀態中,然后使用Response.Redirect()方法將頁面強制重定向到另外一個頁面(DestinationPage.aspx)。在這個目標頁面中再次通過Page.Session屬性來獲取用戶在源頁中保存的用戶名。
源頁的源代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>源頁:通過會話狀態傳遞數據!</title> </head> <body> <form id="form1" runat="server"> <div> 用戶名: <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> <asp:Button ID="SubmitButton" runat="server" Text="提交數據" onclick="SubmitButton_Click" /> </div> </form> </body> </html>
源頁中用來保存用戶名到會話狀態并重定向到目標頁的代碼如下:
protected void SubmitButton_Click(object sender, EventArgs e) { this.Session["UserName"] = this.UserNameTextBox.Text; this.Response.Redirect("DestinationPage.aspx"); }
目標頁中獲取保存在會話狀態中的用戶名的代碼如下:
protected void Page_Load(object sender, EventArgs e) { string UserName = this.Session["UserName"].ToString(); this.Response.Write(UserName); }
四、通過源頁的公共屬性傳遞數據
在示例代碼中,我們在源頁中提供了一個輸入用戶名的文本框,然后通過單擊【提交到目標頁】按鈕將數據提交到目標頁。
源頁的源代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>源頁:通過公共屬性傳遞數據!</title> </head> <body> <form id="form1" runat="server"> <div> 用戶名:<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> <br /> <asp:Button ID="SubmitButton" runat="server" Text="提交到目標頁" PostBackUrl="~/DestinationPage.aspx" /> </div> </form> </body> </html>
并且為源頁定義了一個名為UserName的公共屬性,此屬性返回的是【用戶名】文本框中輸入的用戶名。
public string UserName { get { return this.UserNameTextBox.Text; } }
這樣我們就創建了一個包含公共屬性的源頁。接著創建目標頁,并且為目標頁添加@PreviousPageType指令,當然也可以使用@Reference指令。
<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>
這樣,ASP.NET就會自動將目標頁的Page.PreviousPage屬性轉換為源頁的類型,從而就可以直接訪問UserName屬性。注意觀察下面的代碼,我們并沒有將Page.PreviousPage進行顯示的類型轉換。
if (this.PreviousPage != null) { string UserName = this.PreviousPage.UserName; this.Response.Write(UserName); }
需要特別強調的是不要忘記判斷Page.PreviousPage屬性是否為null,因為它確實有為null的可能性。如果在為null的情況下獲取UserName這個源頁的公共屬性,那是會跳出異常的。
五、通過源頁中的控件值傳遞數據
這最后一種傳遞數據的方式就是直接獲取源頁的控件對象了,然后通過控件的屬性值來獲取所需的數據。比如本示例代碼中,我們就是通過獲取源頁的TextBox控件,然后通過訪問TextBox.Text屬性來獲取用戶在源頁中輸入的數據。
下面的示例代碼中,我們在源頁放置了一個輸入用戶名的文本框,ID為UserNameTextBox。通過Page.PreviousPage.FindControl()方法就可以獲取此控件的引用。
源頁的源代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>源頁:通過控件屬性傳遞數據!</title> </head> <body> <form id="form1" runat="server"> <div> 用戶名:<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> <br /> <asp:Button ID="SubmitButton" runat="server" Text="提交到目標頁" PostBackUrl="~/DestinationPage.aspx" /> </div> </form> </body> </html>
目標頁中獲取文本框控件,并獲取其Text屬性值的代碼如下:
if (this.PreviousPage != null) { TextBox UserNameTextBox = (TextBox)this.PreviousPage.FindControl("UserNameTextBox"); if (UserNameTextBox != null) { this.Response.Write(UserNameTextBox.Text); } }
如果所要獲取的控件位于某個控件的內部,比如下面的代碼,UserNameTextBox控件位于名為UserPanel的Panel控件內部。那么首先找出這個Panel控件,然后通過此控件的FindControl()方法找出內部的文本框控件。
源頁的源代碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>源頁:通過控件屬性傳遞數據!</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Panel ID="UserPanel" runat="server"> 用戶名:<asp:TextBox ID="UserNameTextBoxInPanel" runat="server"></asp:TextBox> <br /> <asp:Button ID="SubmitButtonInPanel" runat="server" Text="提交到目標頁" PostBackUrl="~/DestinationPage.aspx" /> </asp:Panel> </div> </form> </body> </html>
目標頁中獲取這個位于Panel控件內部的TextBox控件的代碼如下:
if (this.PreviousPage != null) { Panel UserPanel = (Panel)this.PreviousPage.FindControl("UserPanel"); if (UserPanel != null) { TextBox UserNameTextBox = (TextBox)UserPanel.FindControl("UserNameTextBoxInPanel"); if (UserNameTextBox != null) { this.Response.Write(UserNameTextBox.Text); } } }
不管控件位于那個級別的命名容器控件內部,都是通過這種方式來獲取的。
一定不要忘記判斷所獲取的控件引用是否為null。
到這里為止,5種在網頁間傳遞數據的方式基本已經展示完畢!^_^
光腳丫思考 2010-11-9