在ASP.NET網頁間傳遞數據的五種方法

作者: 光腳丫思考  來源: 博客園  發布時間: 2010-11-11 23:14  閱讀: 7457 次  推薦: 0   原文鏈接   [收藏]  

重點總結

目前為止在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

0
0
 
標簽:ASP.NET
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()