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>