ASP.NET跨页提交功能详解

开发 后端
本文向您提交AP.NET跨页提交的方法,作者根据自己的经验提供了传统ASP.NET跨页提交和另一种解决问题的思路。

标准HTML表单(form元素)允许你向另外一个页面或者应用程序传递和发送数据信息,方法是使用表单元素。在ASP.NET 1.x中,网页则利用投递机制,把页面数据提交给该页本身。下面就让我们来探讨这个新特性:

传统ASP.NET跨页提交方法

为了便于比较,我们来回顾网页传递数据的老方法。HTML的表格元素有一个action(动作)属性,用来指定服务器端哪项资源(所谓资源,是指一个网页、一段脚本、程序等)来处理这些提交的数据。下面的代码便是一个样例。

以下是引用片段:

  1. 〈html〉  
  2. 〈head〉〈title〉Sample HTML form〈/title〉〈/head〉  
  3. 〈body〉  
  4. 〈form name="frmSample" method="post" action="target_url"〉  
  5. 〈input type="text" name="fullname" id="fullname" /〉  
  6. 〈input type="button" name="Submit" value="submit" /〉  
  7. 〈/form〉  
  8. 〈/body〉  
  9. 〈/html〉  

在文本域(名字是fullname)中输入的值将被提交给表单元素的action属性指定的页面或者程序。对于ASP.NET开发者,即使曾经用过标准HTML表单,也是极不多见的。

ASP.NET开发者面对要从一个网页向另一个网页传递数据信息的任务时,方法选择的余地是异常广阔的。它们包括会话变量(session variables)、cookies、querystring 变量、caching(网页缓存),甚至Server.Transfer方法,但是SP.NET跨页提交还提供了另外一种选择。

SP.NET跨页提交的又一办法

在设计ASP.NET 2.0的时候,微软认识到了在网页间交叉传递数据的需求。有了这个意识之后,就为ASP.NET的button(按钮)控件增加了一项 PostBackUrl属性。它允许你在用户提交的时候,指明这张表单和上面的数据送往何方(也就是由PostBackUrl属性指定的URL值确定)。一般来讲,跨页传递是客户端在后台使用JavaScript进行传送的过程。

以下是引用片段:

  1. 〈%@ Page language="vb" %〉  
  2. 〈!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML   
  3. 4.0 Transitional//EN" 〉  
  4. 〈html〉〈head〉  
  5. 〈title〉Cross Postback Example〈/title〉  
  6. 〈/head〉〈body〉  
  7. 〈form id="frmCrossPostback1" method="post"   
  8. runat="server"〉  
  9. 〈asp:Label ID="lblName" runat="server" Text="Name:"〉  
  10. 〈/asp:Label〉  
  11. 〈asp:TextBox ID="txtName" runat="server"〉  
  12. 〈/asp:TextBox〉〈br /〉  
  13. 〈asp:Label ID="lblE-mailAddress" runat="server"   
  14. Text="E-mail:"〉〈/asp:Label〉  
  15. 〈asp:TextBox ID="txtE-mailAddress" runat="server"〉  
  16. 〈/asp:TextBox〉〈br /〉   
  17. 〈asp:Button ID="btnSubmit" runat="server"   
  18. Text="Submit" PostBackUrl="CrossPostback2.aspx" /〉  
  19. 〈/form〉  
  20. 〈/body〉  
  21. 〈/html〉  

ASP.NET页面拥有两个文本域(分别表示name(名字)和e-mail(电子邮件)),以及一个用来提交数据的button(按钮)。这个提交按钮的PostBackUrl属性被指定为另外一个网页,这样使得表单提交的时候,数据可以发送到那个页面。注意:这个例子中,表单元素通过设置 method(方法)属性,让表单提交时采用post[2]提交方式,但这不是必要的,因为所有cross postback(跨页投递)根据设计均使用post方法。

使用先前页面

ASP.NET页面经由跨页投递的调用而载入的时候,它上面的对象的IsPostBack属性不会被触发。不过,有一项叫做PreviousPage(前一页)的属性使你能够访问和使用那些应用跨页投递的页面。

每当一个跨页请求发生时,当前页的PreviousPage属性就把促发投递的页面引用保存下来。如果页面的产生不是来自跨页投递的激发,或者说页面处于不同的程序组,那么PreviousPage属性将不会被初始化。

你可以通过检查PreviousPage对象来确定页面的载入是否为跨页投递的结果。值如果为null,则说明是普通的载入,而非null值则表明网页来自跨页投递。此外,页面类(Page class)还包含了一个称作IsCrossPagePostBack的方法(method),专门用来确定页面是不是跨页投递的结果。

一旦确定发生了跨页投递,你就可以通过PreviousPage对象的FindControl方法去访问调用页(calling page)上的控件。下面的代码是我们例子中的第二页;它由前面列出的页面所调用。

以下是引用片段:

  1. 〈%@ Page language="vb" %〉  
  2. 〈!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML   
  3. 4.0 Transitional//EN" 〉  
  4. 〈html〉〈head〉  
  5. 〈title〉Cross Postback Example 2〈/title〉  
  6. 〈/head〉〈body〉  
  7. 〈script language="vb" runat="server"〉  
  8. Sub Page_Load()  
  9. If Not (Page.PreviousPage Is Nothing) Then 
  10. If Not (Page.IsCrossPagePostBack) ThenResponse.Write  
  11. ("Name:" + CType(PreviousPage.FindControl("txtName"),   
  12. TextBox).Text + "〈BR〉")Response.Write("E-mail:" +   
  13. CType(PreviousPage.FindControl("txtE-mailAddress"),   
  14. TextBox).Text + "〈BR〉")   
  15. End If  
  16. End If  
  17. End Sub  
  18. 〈/script〉  
  19. 〈/body〉  
  20. 〈/html〉  

这个页先判断它是不是由跨页投递所调用。如果是,就通过FindControl方法访问来自调用页的数值,并把用此方法得到的控件转换为TextBox控件,然后显示它们的Text(文本)属性的内容。

你可以把整个PreviousPage对象转换成触发跨页投递的页面类型。这个方法允许你访问页面的全局属性(public properties)和方法。下面代码是添加了两个属性的***个清单,这两个属性用于访问域值。

#p#

以下是引用片段:

  1. 〈%@ Page language="vb" % 〉  
  2. 〈!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML   
  3. 4.0 Transitional//EN"  〉  
  4. 〈html 〉〈head 〉  
  5. 〈title 〉Cross Postback Example〈/title 〉  
  6. 〈script language="vb" runat="server" 〉  
  7. Public ReadOnly Property Name 
  8. Get  
  9. Return Me.txtName.Text  
  10. End Get  
  11. End Property  
  12. Public ReadOnly Property E-mailAddress  
  13. Get  
  14. Return Me.txtE-mailAddress.Text  
  15. End Get  
  16. End Property  
  17. 〈/script 〉〈/head 〉〈body 〉  
  18. 〈form id="frmCrossPostback1" method="post"   
  19. runat="server" 〉  
  20. 〈asp:Label ID="lblName" runat="server"   
  21. Text="Name:" 〉〈/asp:Label 〉   
  22. 〈asp:TextBox ID="txtName" runat="server" 〉  
  23. 〈/asp:TextBox 〉〈br / 〉  
  24. 〈asp:Label ID="lblE-mailAddress" runat="server"   
  25. Text="E-mail:" 〉〈/asp:Label 〉  
  26. 〈asp:TextBox ID="txtE-mailAddress" runat="server" 〉  
  27. 〈/asp:TextBox 〉〈br / 〉  
  28. 〈asp:Button ID="btnSubmit" runat="server"   
  29. Text="Submit" PostBackUrl="CrossPostback2.aspx" / 〉  
  30. 〈/form 〉  
  31. 〈/body 〉  
  32. 〈/html 〉  

既然现在属性已经建好,那你就能很容易访问它们。要警惕的是,Page类的PreviousPage对象必须转换成正确的类型,这样才能正确访问它的属性。这可以通过把它转换成合适的page类别的对象加以实现。

以下是引用片段:

  1. 〈%@ Page language="vb"% 〉  
  2. 〈%@ Reference Page="~/CrossPostback1.aspx" % 〉  
  3. 〈!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML   
  4. 4.0 Transitional//EN"  〉  
  5. 〈html 〉  
  6. 〈head 〉  
  7. 〈title 〉Cross Postback Example 3〈/title 〉  
  8. 〈/head 〉〈body 〉  
  9. 〈script language="vb" runat="server" 〉  
  10. Sub Page_Load()  
  11. Dim cppPage As CrossPostback1_aspx  
  12. If Not (Page.PreviousPage Is Nothing) Then 
  13. If Not (Page.IsCrossPagePostBack) Then 
  14. If (Page.PreviousPage.IsValid)   
  15. ThencppPage = CType(PreviousPage, CrossPostBack1_aspx)  
  16. Response.Write("Name:" + cppPage.Name + "〈br 〉")  
  17. Response.Write("E-mail:" + cppPage.E-mailAddress)   
  18. End If  
  19. End If  
  20. End If  
  21. End Sub  
  22. 〈/script 〉  
  23. 〈/body 〉  
  24. 〈/html 〉  

说明了这一点,它在页面头部定义了调用页的一项引用,那样这个引用类型就能在代码中使用。通过这项引用,实际的VB.NET代码使用CType函数把PreviousPage对象转换成了适当的类型。这之后,那些属性就可以像代码示范的那样使用了。

关于上述清单中PreviousPage对象IsValid方法的使用在此提醒一下:前页的IsValid属性保证你对它操作之前,它已通过所有合法验证测试。

总结

在网页间传递数据参数有很多项应用,包括保持个人用户信息。祖传的网页解决方案,像使用querystring和cookies,允许你很容易当提交发生时从一个页面指向另一个页面。

ASP.NET 1.1除了提供额外方法外,对这些方法也能很好地支持,可是,ASP.NET跨页提交功能,使这方面又有了长足发展。它让一个网页处理来自另一网页的数据变得简单。在你开发你的下一个ASP.NET 2.0程序的时候,可要好好利用这个新概念的优势啊。

【编辑推荐】

  1. ASP.NET环境下的Shell函数
  2. 在ASP.NET中向数据库批量插入数据
  3. ASP.NET用Post方式向网页发送数据
  4. ASP.NET 2.0部署WEB应用程序浅析
  5. ASP.NET上传文件面面观
责任编辑:冰荷 来源: it55
相关推荐

2009-07-27 17:26:39

ASP.NET功能

2009-07-29 16:08:07

ASP和ASP.NET

2009-08-21 10:51:55

ASP.NET Rou解析URL

2009-07-23 13:19:51

2009-07-28 16:57:50

ASP.NET Ses

2009-08-05 11:14:33

ASP.NET ISA

2009-07-24 10:14:22

ASP.NET开发

2009-07-22 16:25:41

ASP.NET AJA

2009-09-09 12:35:00

ASP.NET回车提交回车提交事件

2009-07-29 15:34:13

2015-11-19 09:26:01

ASP.NET跨平台实践

2009-10-26 15:55:43

URL Routing

2017-03-06 11:13:57

ASP.NETCoreMVC

2009-07-28 13:39:44

加载ViewStateASP.NET

2009-08-04 10:43:59

ASP.NET控件开发

2009-08-19 13:44:00

ASP.NET Lis

2009-08-04 18:10:35

ASP.NET动态编译

2009-07-23 13:09:23

2009-07-27 13:39:06

Web窗体页ASP.NET

2010-10-08 14:32:32

ASP.NET MVCNuPack
点赞
收藏

51CTO技术栈公众号