ASP页面间的数据传递

在Web环境中,我们都遇到过类似如下的糟糕情况:填写一个表格,点击“Next”,填写更多的详细信息,这时,与服务器的连接突然中断,或者你漏填了一些信息;当你返回到前面的页面时,那些原来已经有内容的文本框全部成了空白!这种情况对于用户来说无论如何也不能接受,所以对于一个认真的Web程序开发者来说,创建用户友好的表单是非常必须的。

递归ASP页面

  ASP中一个流行的技术就是:通过使用递归技术使ASP页面保持多任务化。比如说:从一个表单提交数据到首次创建表单的页面。

  每当提交用户的结果数据到页面本身时,在ASP中,输出2个以上的不同HTML页面到浏览器。实现这个功能,是相当简单的。因此,控制页面变得很简单,因为不需要在每一个表单的Action属性中定义正确的页面URL,ASP能够自动填写细节信息。下面看看一个例子。



  一个由三部分组成的表单(在一个ASP页面中)



本文末尾下载的代码passvalues.asp,依次创建三个页面,每个页面上都会有以下三个按钮中的相关几个:“Next”、“Back”和 “Cancel”。第一个页面在浏览器中打开后,如下所示:

点击Next按钮后,在同一页面中提示输入First name和Last Name:

再点击Next,需要填写更详细的信息:

到这里后,不要点击“Finish”按钮,而是返回到前面2个页面。每个页面都包含着你刚刚输入的信息,同样,通过页面中文本框的组合以及表单中的隐藏域,将信息从一个页面传递到另一个页面。比如说,返回到第一个“欢迎”页面后,服务器至少就了解了你输入的名字:

这是怎样工作的

  阅读passvalues.asp的源代码,你可以看到实现例程是很简单的。依据页面的显示次序,以及按钮的点击,每次页面的显示部分都由一个单独ASP文件中的相关独立代码创建。当Finish或者Cancel按钮被点击时,就将调入一个独立的主页面。

If Len(Request("cancel")) > 0 Then Response.Redirect "main_menu.asp"

If Len(Request("finish")) > 0 Then Response.Redirect "main_menu.asp"

如果点击了Back或者Next按钮,ASP代码将检查前面的页面数字,按照需要增加或者减少。通过在页面的表单上建立名字叫pagenum的隐藏域,传递前面的页码数字到页面。

strMode = Request.Form("pagenum")

If Len(Request("back")) Then

strMode = strMode - 1 'Back' button clicked

Else

strMode = strMode + 1 'Next' button clicked

End If

通过页码数值,执行相关的代码片段。如果变量strMode的新值是1,或者用户首次调用页面(这时在表单中将没有任何值),就将执行第3段代码:

If strMode = "2" Then

'ASP and HTML code to create page 2 goes here

ElseIf strMode = "3" Then

'ASP and HTML code to create page 3 goes here

Else

'ASP and HTML code to create page 1 goes here

End If

在页面的每段中(记住:每次只执行3段中的一个),使用正规的HTML控制在页面中传递数值。当显示页面2时,执行的代码下一个显示。注意:所有在页面上显示的数值保存在页面的隐藏域中。

...

First Name:



<INPUT TYPE="TEXT" NAME="value1" SIZE="20"

   VALUE="<% = Server.HTMLEncode(Request("value1")) %>"><P>

Last Name:

<INPUT TYPE="TEXT" NAME="value2" SIZE="20"

    VALUE="<% = Server.HTMLEncode(Request("value2")) %>">

<INPUT TYPE="HIDDEN" NAME="value3"

    VALUE="<% = Server.HTMLEncode(Request("value3")) %>">

<INPUT TYPE="HIDDEN" NAME="value4"

    VALUE="<% = Server.HTMLEncode(Request("value4")) %>">

<INPUT TYPE="HIDDEN" NAME="pagenum" VALUE="2">

<HR>

<INPUT TYPE="SUBMIT" NAME="back" VALUE="&lt;&nbsp; Back"> &nbsp;

<INPUT TYPE="SUBMIT" NAME="next" VALUE="Next &nbsp;&gt;"> &nbsp;

<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="Cancel">

...

  在每段代码的结尾,是提交按钮的相关组合。你可以在表单上放置多于1个的提交按钮,但是只有被点击的提交按钮才将数值送回(如果使用脚本调用提交方法来提交表单,则不返回任何数值)。所以,如果用户点击“Back”按钮,数值back=&lt;&nbsp; Back将出现在表单集合Request.Form中。我们并不关心按钮的实际数值,所以代码(如你前面所见)仅仅验证是否存在数值:



If Len(Request("back")) Then

strMode = strMode - 1 'Back' button clicked

...

使用Server.HTMLEncode



  注意:在放置用户数据到页面前,我们将使用ASP服务器对象的HTMLEncode方法:

<INPUT TYPE="TEXT" NAME="value3" SIZE="40"

   VALUE="<% = Server.HTMLEncode(Request("value3")) %>"><P>

  如果用户在文本框中输入了非法的HTML字符,比如双引号(")或者并且符号(&),这将会造成页面的混乱。举个例子,如果你在一个文本框中输入“I love "VBScript" & "JavaScript"”,并且不使用Server.HTMLEncode方法,那么当数值放入隐藏域后,HTML页面代码将会如下:



<INPUT TYPE="HIDDEN" NAME="value3"

   VALUE="I love "VBScript" & "JavaScript"">

  结果就是:在双引号后的字符串部分不见了!浏览器把这些当作是Value属性的结尾。而使用Server.HTMLEncode将会转换内容为合法的HTML格式,并按照你的预想在页面间传递数据:



<INPUT TYPE="HIDDEN" NAME="value3"

   VALUE="I love &quot;VBScript&quot; &amp; &quot;JavaScript&quot;">

列表1,页面2的源代码:



...

<FORM ACTION="/test/pages.asp" METHOD="POST">

<DIV CLASS="intro">Enter your name, as if I was really interested.</DIV><P>

First name:

<INPUT TYPE="TEXT" NAME="value1" SIZE="20"

    VALUE="Alex"><P>

Last Name:

<INPUT TYPE="TEXT" NAME="value2" SIZE="20"

    VALUE="Homer">

<INPUT TYPE="HIDDEN" NAME="value3"

    VALUE="a secret shared">

<INPUT TYPE="HIDDEN" NAME="value4"

    VALUE="is a secret lost">

<INPUT TYPE="HIDDEN" NAME="pagenum" VALUE="2">

<HR>

<INPUT TYPE="SUBMIT" NAME="back" VALUE="&lt;&nbsp; Back"> &nbsp;

<INPUT TYPE="SUBMIT" NAME="next" VALUE="Next &nbsp;&gt;"> &nbsp;

<INPUT TYPE="SUBMIT" NAME="cancel" VALUE="Cancel">

</FORM>

...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值