浅谈ASP.NET功能之跨页提交


  本文标签:ASP.NET功能

  传统办法

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

  以下是ASP.NET功能引用片段:

  1. <html>    
  2. <head><title>Sample HTML formtitle>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方法,但是ASP.NET 2.0还提供了另外一种选择  。

  ASP.NET 2.0提供的又一办法

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

  以下是ASP.NET功能引用片段:

  1. <%@ Page language="vb" %>   
  2. >   
  3. <html><head>   
  4. <title>Cross Postback Exampletitle>   
  5. head><body>   
  6. <form id="frmCrossPostback1" method="post" runat="server">   
  7. <asp:Label ID="lblName" runat="server" Text="Name:">asp:Label>   
  8. <asp:TextBox ID="txtName" runat="server">asp:TextBox><br />   
  9. <asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:">asp:Label>   
  10. <asp:TextBox ID="txtE-mailAddress" runat="server">asp:TextBox><br />    
  11. <asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" />   
  12. form>   
  13. body>   
  14. 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)上的控件  。下面的代码是我们例子中的第二页;它由前面列出的页面所调用  。

  以下是ASP.NET功能引用片段:

  1. <%@ Page language="vb" %>   
  2. >   
  3. <html><head>   
  4. <title>Cross Postback Example 2title>   
  5. head><body>   
  6. <script language="vb" runat="server">   
  7. Sub Page_Load()   
  8. If Not (Page.PreviousPage Is Nothing) Then   
  9. If Not (Page.IsCrossPagePostBack) ThenResponse.Write("Name:" + CType(PreviousPage.FindControl("txtName"), TextBox).Text + "<BR>")Response.Write("E-mail:" + CType(PreviousPage.FindControl("txtE-mailAddress"), TextBox).Text + "<BR>")    
  10. End If   
  11. End If   
  12. End Sub   
  13. script>   
  14. body>   
  15. html>  

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

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

  以下是引用片段:

  1. <%@ Page language="vb" %>   
  2. >   
  3. <html><head>   
  4. <title>Cross Postback Exampletitle>   
  5. <script language="vb" runat="server">   
  6. Public ReadOnly Property Name   
  7. Get   
  8. Return Me.txtName.Text   
  9. End Get   
  10. End Property   
  11. Public ReadOnly Property E-mailAddress   
  12. Get   
  13. Return Me.txtE-mailAddress.Text   
  14. End Get   
  15. End Property   
  16. script>head><body>   
  17. <form id="frmCrossPostback1" method="post" runat="server">   
  18. <asp:Label ID="lblName" runat="server" Text="Name:">asp:Label>    
  19. <asp:TextBox ID="txtName" runat="server">asp:TextBox><br />   
  20. <asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:">asp:Label>   
  21. <asp:TextBox ID="txtE-mailAddress" runat="server">asp:TextBox><br />   
  22. <asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" />   
  23. form>   
  24. body>   
  25. html>  

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

  以下是引用片段:

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

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

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

  ASP.NET功能总结

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

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