加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_商丘站长网 (https://www.0370zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

ASP JS处理复杂表单

发布时间:2022-09-13 15:18:37 所属栏目:Asp教程 来源:
导读:  ASPJS处理复杂表单所谓的复杂表单,是指表单中包含多种不同的输入类型,比如下拉列表框、单行文本、多行文本、数值等。在经常需要更换这类表单的场合,需要有一个表单的动态生成程序。本文介绍的正是这样一个系统
  ASPJS处理复杂表单所谓的复杂表单,是指表单中包含多种不同的输入类型,比如下拉列表框、单行文本、多行文本、数值等。在经常需要更换这类表单的场合,需要有一个表单的动态生成程序。本文介绍的正是这样一个系统,它以数据库保存表单定义数据,利用ASP脚本动态生成表单HTML代码以及验证表单输入的脚本。一、定义数据库表结构在Web上经常可以看到“每周调查”之类的表单,这就是一种需要经常更新的表单。如果有一个动态生成表单及其验证脚本的程序,可以大大减少制作这些表单的工作量。在本文的动态表单生成与验证示例中,我们使用一个Access数据库来存储有关表单的定义信息,同时为简单计,用户在表单中输入的数据也保存到同一数据库。定义表单需要两个表:第一个表(Definitons)用于表单输入域的定义,第二个表(Lists)保存各个输入域的附加信息,比如选择列表的选择项。表Definitons包含如下字段:FieldName赋予表单输入域的变量名字Label即文本标签,显示在输入域前面的提示性文字Type单个字符,该字符表示表单输入域的形式和输入值的类型具体如下:文本输入框,即,以及在脚本运行结束的时候释放RS、RSList等对象占用的资源。
 
  除了完成上述任务的代码外,示例应用中其余ASP脚本可能生成的页面有两种类型:提问表单(见上图)以及表单提交后出现的结果页面(后者同时还负责用户提交结果的记录)。要确定究竟运行哪一部分脚本,最简单的方法就是检查是否已经提交表单:如是,则处理表单;否则生成表单。是生成表单还是处理表单?以下是引用片段:Else?处理表单三、动态生成表单生成表单时,程序按照Definitons表中的各个输入域定义记录,依次生成相应的表单HTML代码和JavaScript代码。HTML代码中首先要生成的是文本标签:以下是引用片段:sHTMLvbTabsHTMLTDVALIGN="Chr(34)sHTMLvbTabsHTMLRS.Fields("Label")然后程序检查当前输入域是否必须输入。如果必须,则在标签文本之后加一个星号(表示该值必须输入),同时对于必须输入的值,还要生成相应的JavaScript代码来验证它。对于单选按钮或选择列表,需进一步检查用户确实选择了某个选项;对于所有其他输入类型,只要检查输入值不为空即可。紧接文本标签的是表单的输入元素,这些元素的HTML代码根据Definitions表中指定的类型和属性生成。
 
  再接下来就是根据输入值要求生成执行客户端验证任务的JavaScript代码。对于本例,只有数字型的值需要进一步检查以保证用户的输入确实是数字,而且数字值在许可的最大值和最小值之间。生成上述代码之后,就可以结束一个表格行(也就是一个输入域)继续处理Definitions表的下一个记录。一旦所有的数据库记录处理完毕,下一步就可以加入“提交”按钮和“清除”按钮的HTML代码。如果换个角度来看,程序在这里的任务就是根据数据库记录生成各个输入域,每个输入域占用一个表格行,每个表格行二个单元:第一个单元用来显示文本标签,第二个单元显示输入元素本身(代码见dForm.asp)。上述过程结束之后,表单的HTML代码和验证用JavaScript函数分别保存到了变量sHTML和sJavaScript中。在把这些内容写入页面之前,程序检查客户端是否要求执行JavaScript验证,如果不要求执行这类验证,则清除sJavaScript变量:在输出BODY标记之后,程序输出如下JavaScript 函数: 以下是引用片段: SCRIPTLANGUAGE="JavaScript" functionvalidate(TheForm){ //客户端表单验证 returntrue; functionCheckRadio(objRadio){ //单选按钮中是否有某个值被选中 for(var if(objRadio[n].checked){return true; returnfalse; functionCheckList(objList){ //是否已经在选择列表中选择了某个值 for(var if(objList.options[n].selected){return true; returnfalse; 如果客户端不需要JavaScript验证,则validate 函数只剩下一个“return true”语句。
 
  上面代码中的后面两个静态JavaScript函数(CheckRadio和CheckList)用于验证单选按钮和 下拉列表框,当这两种输入域需要验证时validate 函数将调用它们。 现在可以开始把表单写入页面: FORMACTION="./dform.asp" METHOD="POST" onSubmit="return validate(this)" 在这里ASP表单,只有当validate 函数返回 true 时才执行表单提交操作。因此当客户端 JavaScript 验证功能关闭时,validate 函数将自动返回true。 接下来要加入的是名为val 的隐藏域。如前所述,该值指示表单的验证模式。 INPUTTYPE="HIDDEN" VALUE="< %=iValType% 当用户提交表单时,处理脚本将根据该值确定是否执行服务器端验证。然后输出的是表格标记以及表格标题。标题保存在变量sTitleLabel 始执行时初始化:以下是引用片段: TABLEBORDER="0" TDCOLSPAN="2" 作为改进措施,可以在表Definitions、Lists和Records 中增加一个字段FormID。
 
  FormID 唯一标识一个表单,这样程序就可以同时地定义多个表单、保存多个表单的用户应答结果。 至于上面的sTitleLabel,我们可以用另外一个表(比如Forms)来保存。 紧接着表格标记和表格标题,程序输出的是HTML 表单以及“提交”、“清除”按钮的代码。 在此之后,程序检查sHTML 字符串中是否包含“*”,如包含的话说明表单中存在必须输入的 内容,此时就输出一个脚注以说明该星号的含义。 以下是引用片段: TDCOLSPAN="2" INPUTTYPE="SUBMIT" VALUE="提交表单" INPUTTYPE="reset" VALUE="清除" TDCOLSPAN="2" FONTSIZE="2" >注意:有星号标记的值必需输入。< /FONT 至此为止,表单的生成任务已经完成。四、处理提交结果 ASP 脚本剩下的任务是服务器端的表单处理,包括验证、将结果保存到数据库以及“提 交成功/失败”页面的显示。在这部分表单验证代码中用到了一个字符串变量 sBadForm,程 序用它来保存错误信息。如果在验证过程结束时sBadForm 为空,说明用户提交的表单是合法 的;否则,拒绝该表单的提交并把sBadForm 返回给浏览器。
 
  不管表单采用哪种验证模式,检查HTTP_REFERER 都是一种好的习惯。这种检查可以防止 脚本被盗用。要检查某个POST 是否来自本网站的页面或脚本,只需比较两个服务器变量即可: 以下是引用片段: LI>表单提交自不正确的位置。" vbCrlfEnd 如果表单的隐藏域指示必须进行服务器端验证,则程序遍历表单定义数据库记录作相应的检查,其过程与表单的生成非常相似,只不过此时程序是验证表单,且把输入值非法信息 加入到sBadForm 中去而已。具体代码见dForm.asp。 程序最后检查sBadForm 是否为空。如不为空,则拒绝表单提交并将sBadForm 写入浏览 器。如果sBadForm 为空,则在Records 表增加一个记录保存表单数据。在保存表单内容之前 需要删除隐藏域val,这个隐藏域总是表单的第一个输入域: 以下是引用片段: RS.Open"Records", DB, &H0002RS.AddNew RS.Fields("Record") Mid(Request.Form,InStr(Request.Form, Now()RS.Fields("RemoteIP") Request.ServerVariables("REMOTE_ADDR")RS.Update Response.Write("< H1 >谢谢.< /H1 RS.CloseElse Response.Write("< H1 >表单提交失败。
 
  < /H1 sBadForm)End 这就是服务器端表单处理的全部过程。根据是否存在已经提交的表单,我们可以把前面生成表单的代码和这里表单处理的代码用If 语句封装,使得这两部分脚本共享部分公用代码, 比如HTML 文档的头、数据库对象的创建和资源释放等。 总地看来,dForm.asp 只具备了动态表单生成、验证所必需的核心功能,忽略了许多细 节问题的处理。比如前面已经提到的多表单问题:增加一个表管理多个表单,使得脚本具有 管理、生成、处理指定表单的能力。另外一个明显的缺乏是表单定义数据的增加、删除和更 新功能,以及用户提交结果数据的访问,这类功能可以在一个独立的程序中实现,而且在大 多数情况下可以做成传统的应用程序(非 结构的应用)。最后,dForm.asp支持的输入域 类型也有限,在实践中可能会有其他的表单输入要求,比如专用的e-mail 地址输入框等。然 而,对于那些经常要更新表单的网站来说,本文所讨论的表单动态生成、动态验证功能确实 是非常有用的。
 

(编辑:开发网_商丘站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!