ASP.NET网页间传递数据的方法

重点总结

目前为止在ASP.NET网页中传递数据的方式至少有一下几种种:

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" %> 
02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
04 <html xmlns="http://www.w3.org/1999/xhtml"> 
05 <head runat="server"> 
06     <title>源页!</title> 
07 </head> 
08 <body> 
09     <form id="form1" runat="server"> 
10     <div> 
11         User Name : 
12         <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 
13         <br /> 
14         Birth Date :  
15         <asp:TextBox ID="BirthDateTextBox" runat="server"></asp:TextBox> 
16         <br /> 
17         Age :  
18         <asp:TextBox ID="AgeTextBox" runat="server"></asp:TextBox> 
19         <br /> 
20         <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页"
21             PostBackUrl="~/DestinationPage.aspx" /> 
22     </div> 
23     </form> 
24 </body> 
25 </html>
01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 

02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

04 <html xmlns="http://www.w3.org/1999/xhtml"> 

05 <head runat="server"> 

06     <title>源页!</title> 

07 </head> 

08 <body> 

09     <form id="form1" runat="server"> 

10     <div> 

11         User Name : 

12         <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 

13         <br /> 

14         Birth Date :  

15         <asp:TextBox ID="BirthDateTextBox" runat="server"></asp:TextBox> 

16         <br /> 

17         Age :  

18         <asp:TextBox ID="AgeTextBox" runat="server"></asp:TextBox> 

19         <br /> 

20         <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页"

21             PostBackUrl="~/DestinationPage.aspx" /> 

22     </div> 

23     </form> 

24 </body> 

25 </html>

 

目标页中获取源页窗体数据的代码如下:

01 protected void Page_Load(object sender, EventArgs e) 
02 { 
03     StringBuilder SBuilder = new StringBuilder(); 
04     NameValueCollection PostedValues = 
05         this.Request.Form; 
06     for (int Index = 0; Index < PostedValues.Count; Index++) 
07     { 
08         if (PostedValues.Keys[Index].Substring(0, 2) != "__") 
09         { 
10             SBuilder.Append(string.Format("{0} = {1}", 
11                 PostedValues.Keys[Index], 
12                 PostedValues[Index])); 
13             SBuilder.Append("<br />"); 
14         } 
15     } 
16     this.Response.Write(SBuilder.ToString()); 
17 }

01 protected void Page_Load(object sender, EventArgs e) 

02 { 

03     StringBuilder SBuilder = new StringBuilder(); 

04     NameValueCollection PostedValues = 

05         this.Request.Form; 

06     for (int Index = 0; Index < PostedValues.Count; Index++) 

07     { 

08         if (PostedValues.Keys[Index].Substring(0, 2) != "__") 

09         { 

10             SBuilder.Append(string.Format("{0} = {1}", 

11                 PostedValues.Keys[Index], 

12                 PostedValues[Index])); 

13             SBuilder.Append("<br />"); 

14         } 

15     } 

16     this.Response.Write(SBuilder.ToString()); 

17 }

 

代码中的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" %> 
02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
04 <html xmlns="http://www.w3.org/1999/xhtml"> 
05 <head runat="server"> 
06     <title>源页:通过会话状态传递数据!</title> 
07 </head> 
08 <body> 
09     <form id="form1" runat="server"> 
10     <div> 
11         用户名: 
12         <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 
13         <asp:Button ID="SubmitButton" runat="server" Text="提交数据" 
14             οnclick="SubmitButton_Click" /> 
15     </div> 
16     </form> 
17 </body> 
18 </html>

 
01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 

02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

04 <html xmlns="http://www.w3.org/1999/xhtml"> 

05 <head runat="server"> 

06     <title>源页:通过会话状态传递数据!</title> 

07 </head> 

08 <body> 

09     <form id="form1" runat="server"> 

10     <div> 

11         用户名: 

12         <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 

13         <asp:Button ID="SubmitButton" runat="server" Text="提交数据" 

14             οnclick="SubmitButton_Click" /> 

15     </div> 

16     </form> 

17 </body> 

18 </html>

 

源页中用来保存用户名到会话状态并重定向到目标页的代码如下:

protected void Page_Load(object sender, EventArgs e) 
2 { 
3     string UserName = this.Session["UserName"].ToString(); 
4     this.Response.Write(UserName); 
5 }

1 protected void SubmitButton_Click(object sender, EventArgs e) 

2 { 

3     this.Session["UserName"] = this.UserNameTextBox.Text; 

4     this.Response.Redirect("DestinationPage.aspx"); 

5 }

 

目标页中获取保存在会话状态中的用户名的代码如下:

 
01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 

02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

04 <html xmlns="http://www.w3.org/1999/xhtml"> 

05 <head runat="server"> 

06     <title>源页:通过公共属性传递数据!</title> 

07 </head> 

08 <body> 

09     <form id="form1" runat="server"> 

10     <div> 

11         用户名:<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 

12         <br /> 

13         <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页"

14             PostBackUrl="~/DestinationPage.aspx" /> 

15     </div> 

16     </form> 

17 </body> 

18 </html>

1 protected void Page_Load(object sender, EventArgs e) 

2 { 

3     string UserName = this.Session["UserName"].ToString(); 

4     this.Response.Write(UserName); 

5 }

 

 

四、通过源页的公共属性传递数据

在示例代码中,我们在源页中提供了一个输入用户名的文本框,然后通过单击【提交到目标页】按钮将数据提交到目标页。

源页的源代码如下:

 
 
01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 

02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

04 <html xmlns="http://www.w3.org/1999/xhtml"> 

05 <head runat="server"> 

06     <title>源页:通过公共属性传递数据!</title> 

07 </head> 

08 <body> 

09     <form id="form1" runat="server"> 

10     <div> 

11         用户名:<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 

12         <br /> 

13         <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页"

14             PostBackUrl="~/DestinationPage.aspx" /> 

15     </div> 

16     </form> 

17 </body> 

18 </html>

 

并且为源页定义了一个名为UserName的公共属性,此属性返回的是【用户名】文本框中输入的用户名。

 public string UserName 

2 { 

3     get { return this.UserNameTextBox.Text; } 

4 }

1 public string UserName 

2 { 

3     get { return this.UserNameTextBox.Text; } 

4 }

 

这样我们就创建了一个包含公共属性的源页。接着创建目标页,并且为目标页添加@PreviousPageType指令,当然也可以使用@Reference指令。

view source

print?1 <%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %>

 

这样,ASP.NET就会自动将目标页的Page.PreviousPage属性转换为源页的类型,从而就可以直接访问UserName属性。注意观察下面的代码,我们并没有将Page.PreviousPage进行显示的类型转换。

view source

print?1 if (this.PreviousPage != null) 

2 { 

3     string UserName = this.PreviousPage.UserName; 

4     this.Response.Write(UserName); 

5 }

 

需要特别强调的是不要忘记判断Page.PreviousPage属性是否为null,因为它确实有为null的可能性。如果在为null的情况下获取UserName这个源页的公共属性,那是会跳出异常的。

 

 

五、通过源页中的控件值传递数据

这最后一种传递数据的方式就是直接获取源页的控件对象了,然后通过控件的属性值来获取所需的数据。比如本示例代码中,我们就是通过获取源页的TextBox控件,然后通过访问TextBox.Text属性来获取用户在源页中输入的数据。

下面的示例代码中,我们在源页放置了一个输入用户名的文本框,ID为UserNameTextBox。通过Page.PreviousPage.FindControl()方法就可以获取此控件的引用。

源页的源代码如下:

view source

print?01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 

02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

04 <html xmlns="http://www.w3.org/1999/xhtml"> 

05 <head runat="server"> 

06     <title>源页:通过控件属性传递数据!</title> 

07 </head> 

08 <body> 

09     <form id="form1" runat="server"> 

10     <div> 

11         用户名:<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox> 

12         <br /> 

13         <asp:Button ID="SubmitButton" runat="server" Text="提交到目标页"

14             PostBackUrl="~/DestinationPage.aspx" /> 

15     </div> 

16     </form> 

17 </body> 

18 </html>

目标页中获取文本框控件,并获取其Text属性值的代码如下:

view source

print?1 if (this.PreviousPage != null) 

2 { 

3     TextBox UserNameTextBox = 

4         (TextBox)this.PreviousPage.FindControl("UserNameTextBox"); 

5     if (UserNameTextBox != null) 

6     { 

7         this.Response.Write(UserNameTextBox.Text); 

8     } 

9 }

如果所要获取的控件位于某个控件的内部,比如下面的代码,UserNameTextBox控件位于名为UserPanel的Panel控件内部。那么首先找出这个Panel控件,然后通过此控件的FindControl()方法找出内部的文本框控件。

源页的源代码如下:

view source

print?01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="SourcePage.aspx.cs" Inherits="SourcePage" %> 

02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

03     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

04 <html xmlns="http://www.w3.org/1999/xhtml"> 

05 <head runat="server"> 

06     <title>源页:通过控件属性传递数据!</title> 

07 </head> 

08 <body> 

09     <form id="form1" runat="server"> 

10     <div> 

11         <asp:Panel ID="UserPanel" runat="server"> 

12             用户名:<asp:TextBox ID="UserNameTextBoxInPanel" runat="server"></asp:TextBox> 

13             <br /> 

14             <asp:Button ID="SubmitButtonInPanel" runat="server" Text="提交到目标页"

15                 PostBackUrl="~/DestinationPage.aspx" /> 

16         </asp:Panel> 

17     </div> 

18     </form> 

19 </body> 

20 </html>

目标页中获取这个位于Panel控件内部的TextBox控件的代码如下:

view source

print?01 if (this.PreviousPage != null) 

02 { 

03     Panel UserPanel = (Panel)this.PreviousPage.FindControl("UserPanel"); 

04     if (UserPanel != null) 

05     { 

06         TextBox UserNameTextBox = 

07             (TextBox)UserPanel.FindControl("UserNameTextBoxInPanel"); 

08         if (UserNameTextBox != null) 

09         { 

10             this.Response.Write(UserNameTextBox.Text); 

11         } 

12     } 

13 }

不管控件位于那个级别的命名容器控件内部,都是通过这种方式来获取的。

一定不要忘记判断所获取的控件引用是否为null。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值