重点总结 目前为止在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属性来获取查询字符串中传递的键值。比如下面的代码:
1 |
this .Response.Write( this .Request.QueryString[ "ProductID" ]);
|
2 |
this .Response.Write( "<br />" );
|
3 |
this .Response.Write( string .Format( "ProductID={0} ProductName={1}" ,
|
4 |
this .Request.QueryString[ "ProductID" ],
|
5 |
this .Request.QueryString[ "ProductName" ]));
|
二、通过HTTP POST传递数据 此示例代码在源页中,为用户提供了输入用户名、生日和年龄的文本框,并且将Button控件的PostBackUrl属性设置为DestinationPage.aspx。也就是说当单击【提交到目标页】按钮后,源页窗体的数据会被传递到DestinationPage.aspx页面。 在目标页中则通过Page.Request.Form属性来获取这些传递过来的数据。 源页的页面源码如下:
01 |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> |
03 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
10 |
< form id = "form1" runat = "server" >
|
13 |
< asp:TextBox ID = "UserNameTextBox" runat = "server" ></ asp:TextBox >
|
16 |
< asp:TextBox ID = "BirthDateTextBox" runat = "server" ></ asp:TextBox >
|
19 |
< asp:TextBox ID = "AgeTextBox" runat = "server" ></ asp:TextBox >
|
21 |
< asp:Button ID = "SubmitButton" runat = "server" Text = "提交到目标页"
|
22 |
PostBackUrl = "~/DestinationPage.aspx" />
|
目标页中获取源页窗体数据的代码如下:
01 |
protected void Page_Load( object sender, EventArgs e)
|
03 |
StringBuilder SBuilder = new StringBuilder();
|
04 |
NameValueCollection PostedValues =
|
07 |
for ( int Index = 0; Index < PostedValues.Count; Index++)
|
09 |
if (PostedValues.Keys[Index].Substring(0, 2) != "__" )
|
11 |
SBuilder.Append( string .Format( "{0} = {1}" ,
|
12 |
PostedValues.Keys[Index],
|
13 |
PostedValues[Index]));
|
14 |
SBuilder.Append( "<br />" );
|
18 |
this .Response.Write(SBuilder.ToString());
|
代码中的if语句主要是为了避免获取以两个下划线__开头的隐藏字段的数据,比如__VIEWSTATE、__EVENTTARGET、__EVENTARGUMENT。当然也可以去掉这个if语句,然后就能同时获取这些隐藏字段的数据了。
三、通过会话状态传递数据 使用会话状态的好处是可以在与源页处于相同ASP.NET应用程序的所有网页间共享数据。缺点是会增加服务器的内存开销。 下面的代码中,用户在源页的【用户名】文本框中输入自己的姓名,然后单击【提交数据】按钮。服务器代码会通过Page.Session属性将用户名存储到会话状态中,然后使用Response.Redirect()方法将页面强制重定向到另外一个页面(DestinationPage.aspx)。在这个目标页面中再次通过Page.Session属性来获取用户在源页中保存的用户名。 源页的源代码如下:
01 |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> |
03 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
07 |
< title >源页:通过会话状态传递数据!</ title >
|
10 |
< form id = "form1" runat = "server" >
|
13 |
< asp:TextBox ID = "UserNameTextBox" runat = "server" ></ asp:TextBox >
|
14 |
< asp:Button ID = "SubmitButton" runat = "server" Text = "提交数据"
|
15 |
onclick = "SubmitButton_Click" />
|
源页中用来保存用户名到会话状态并重定向到目标页的代码如下:
1 |
protected void SubmitButton_Click( object sender, EventArgs e)
|
3 |
this .Session[ "UserName" ] = this .UserNameTextBox.Text;
|
4 |
this .Response.Redirect( "DestinationPage.aspx" );
|
目标页中获取保存在会话状态中的用户名的代码如下:
1 |
protected void Page_Load( object sender, EventArgs e)
|
3 |
string UserName = this .Session[ "UserName" ].ToString();
|
4 |
this .Response.Write(UserName);
|
四、通过源页的公共属性传递数据 在示例代码中,我们在源页中提供了一个输入用户名的文本框,然后通过单击【提交到目标页】按钮将数据提交到目标页。 源页的源代码如下:
01 |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> |
03 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
07 |
< title >源页:通过公共属性传递数据!</ title >
|
10 |
< form id = "form1" runat = "server" >
|
12 |
用户名:< asp:TextBox ID = "UserNameTextBox" runat = "server" ></ asp:TextBox >
|
14 |
< asp:Button ID = "SubmitButton" runat = "server" Text = "提交到目标页"
|
15 |
PostBackUrl = "~/DestinationPage.aspx" />
|
并且为源页定义了一个名为UserName的公共属性,此属性返回的是【用户名】文本框中输入的用户名。
3 |
get { return this .UserNameTextBox.Text; }
|
这样我们就创建了一个包含公共属性的源页。接着创建目标页,并且为目标页添加@PreviousPageType指令,当然也可以使用@Reference指令。
1 |
<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> |
这样,ASP.NET就会自动将目标页的Page.PreviousPage属性转换为源页的类型,从而就可以直接访问UserName属性。注意观察下面的代码,我们并没有将Page.PreviousPage进行显示的类型转换。
1 |
if ( this .PreviousPage != null )
|
3 |
string UserName = this .PreviousPage.UserName;
|
4 |
this .Response.Write(UserName);
|
需要特别强调的是不要忘记判断Page.PreviousPage属性是否为null,因为它确实有为null的可能性。如果在为null的情况下获取UserName这个源页的公共属性,那是会跳出异常的。
五、通过源页中的控件值传递数据 这最后一种传递数据的方式就是直接获取源页的控件对象了,然后通过控件的属性值来获取所需的数据。比如本示例代码中,我们就是通过获取源页的TextBox控件,然后通过访问TextBox.Text属性来获取用户在源页中输入的数据。 下面的示例代码中,我们在源页放置了一个输入用户名的文本框,ID为UserNameTextBox。通过Page.PreviousPage.FindControl()方法就可以获取此控件的引用。 源页的源代码如下:
01 |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> |
03 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
07 |
< title >源页:通过控件属性传递数据!</ title >
|
10 |
< form id = "form1" runat = "server" >
|
12 |
用户名:< asp:TextBox ID = "UserNameTextBox" runat = "server" ></ asp:TextBox >
|
14 |
< asp:Button ID = "SubmitButton" runat = "server" Text = "提交到目标页"
|
15 |
PostBackUrl = "~/DestinationPage.aspx" />
|
目标页中获取文本框控件,并获取其Text属性值的代码如下:
1 |
if ( this .PreviousPage != null )
|
3 |
TextBox UserNameTextBox =
|
4 |
(TextBox) this .PreviousPage.FindControl( "UserNameTextBox" );
|
5 |
if (UserNameTextBox != null )
|
7 |
this .Response.Write(UserNameTextBox.Text);
|
如果所要获取的控件位于某个控件的内部,比如下面的代码,UserNameTextBox控件位于名为UserPanel的Panel控件内部。那么首先找出这个Panel控件,然后通过此控件的FindControl()方法找出内部的文本框控件。 源页的源代码如下:
01 |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> |
03 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
07 |
< title >源页:通过控件属性传递数据!</ title >
|
10 |
< form id = "form1" runat = "server" >
|
12 |
< asp:Panel ID = "UserPanel" runat = "server" >
|
13 |
用户名:< asp:TextBox ID = "UserNameTextBoxInPanel" runat = "server" ></ asp:TextBox >
|
15 |
< asp:Button ID = "SubmitButtonInPanel" runat = "server" Text = "提交到目标页"
|
|
请发表评论