当前位置:51VIP源码软件音乐小游戏下载联盟网络学院网络编程ASP技巧 → ASP+JS处理复杂表单的生成与验证

ASP+JS处理复杂表单的生成与验证

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2008-8-18 2:29:00 我要发布文章
只要检查输入值不为空即可。

  紧接文本标签的是表单的输入元素,这些元素的HTML代码根据Definitions表中指定的类型和属性生成。再接下来就是根据输入值要求生成执行客户端验证任务的JavaScript代码。对于本例,只有数字型的值需要进一步检查以保证用户的输入确实是数字,而且数字值在许可的最大值和最小值之间。生成上述代码之后,就可以结束一个表格行(也就是一个输入域)继续处理Definitions表的下一个记录。一旦所有的数据库记录处理完毕,下一步就可以加入“提交”按钮和“清除”按钮的HTML代码。如果换个角度来看,程序在这里的任务就是根据数据库记录生成各个输入域,每个输入域占用一个表格行,每个表格行二个单元:第一个单元用来显示文本标签,第二个单元显示输入元素本身(代码见dForm.asp)。

  上述过程结束之后,表单的HTML代码和验证用JavaScript函数分别保存到了变量sHTML和sJavaScript中。在把这些内容写入页面之前,程序检查客户端是否要求执行JavaScript验证,如果不要求执行这类验证,则清除sJavaScript变量:

  If iValType = 0 Or iValType = 2 Then sJavaScript = ""

  在输出BODY标记之后,程序输出如下JavaScript函数:

以下是引用片段:
  < SCRIPT LANGUAGE="JavaScript" > 
  < !-- 
  function validate(TheForm){ 
  //客户端表单验证 
  < %=sJavaScript% > 
  return true; 
  } 
   
  function CheckRadio(objRadio){ 
  //单选按钮中是否有某个值被选中 
  for(var n = 0; n < objRadio.length; n++){ 
  if(objRadio[n].checked){ 
  return true; 
  } 
  } 
  return false; 
  } 
   
  function CheckList(objList){ 
  //是否已经在选择列表中选择了某个值 
  for(var n = 1; n < objList.length; n++){ 
  if(objList.options[n].selected){ 
  return true; 
  } 
  } 
  return false; 
  } 
  //-- > 
  < /Script >


  如果客户端不需要JavaScript验证,则validate函数只剩下一个“return true”语句。上面代码中的后面两个静态JavaScript函数(CheckRadio和CheckList)用于验证单选按钮和下拉列表框,当这两种输入域需要验证时validate函数将调用它们。

  现在可以开始把表单写入页面:

  < FORM ACTION="./dform.asp" METHOD="POST" NAME="MyForm" >

  在这里,只有当validate函数返回true时才执行表单提交操作。因此当客户端JavaScript验证功能关闭时,validate函数将自动返回true。

  接下来要加入的是名为val的隐藏域。如前所述,该值指示表单的验证模式。

  < INPUT TYPE="HIDDEN" NAME="val" VALUE="< %=iValType% >" >

  当用户提交表单时,处理脚本将根据该值确定是否执行服务器端验证。

  然后输出的是表格标记以及表格标题。标题保存在变量sTitleLabel中,该值在脚本开始执行时初始化:

以下是引用片段:
  < TABLE BORDER="0" > 
  < TR > 
  < TD COLSPAN="2" ALIGN="CENTER" > 
  < H2 >< %=sTitleLable% >< /H2 > 
  < /TD > 
  < /TR >


  作为改进措施,可以在表Definitions、Lists和Records中增加一个字段FormID。FormID唯一标识一个表单,这样程序就可以同时地定义多个表单、保存多个表单的用户应答结果。至于上面的sTitleLabel,我们可以用另外一个表(比如Forms)来保存。

  紧接着表格标记和表格标题,程序输出的是HTML表单以及“提交”、“清除”按钮的代码。在此之后,程序检查sHTML字符串中是否包含“*”,如包含的话说明表单中存在必须输入的内容,此时就输出一个脚注以说明该星号的含义。

以下是引用片段:
  < %=sHTML% > 
  < TR > 
  < TD COLSPAN="2" ALIGN="CENTER" > 
  < INPUT TYPE="SUBMIT" VALUE="提交表单" > < INPUT TYPE="reset" VALUE="清除" > 
  < /TD > 
  < % 
  '是否存在必需输入的表单域,如存在,则输出表单脚注解释'*'的含义 
  If InStr(sHTML,"*") Then 
  % > 
  < /TR > 
  < TD COLSPAN="2" ALIGN="CENTER" > 
  < FONT SIZE="2" >注意:有星号标记的值必需输入。< /FONT > 
  < /TD > 
  < /TR > 
  < % 
  End If 
  % > 
  < /TABLE > 
  < /FORM >


  至此为止,表单的生成任务已经完成。
  四、处理提交结果

  ASP脚本剩下的任务是服务器端的表单处理,包括验证、将结果保存到数据库以及“提交成功/失败”页面的显示。在这部分表单验证代码中用到了一个字符串变量sBadForm,程序用它来保存错误信息。如果在验证过程结束时sBadForm为空,说明用户提交的表单是合法的;否则,拒绝该表单的提交并把sBadForm返回给浏览器。

  不管表单采用哪种验证模式,检查HTTP_REFERER都是一种好的习惯。这种检查可以防止脚本被盗用。要检查某个POST是否来自本网站的页面或脚本,只需比较两个服务器变量即可:

以下是引用片段:
  If InStr(Request.ServerVariables("HTTP_REFERER"), _
  Request.ServerVariables("HTTP_HOST")) = 0 Then
  sBadForm = "< LI >表单提交自不正确的位置。" & vbCrlf
  End If


  如果表单的隐藏域指示必须进行服务器端验证,则程序遍历表单定义数据库记录作相应的检查,其过程与表单的生成非常相似,只不过此时程序是验证表单,且把输入值非法信息加入到sBadForm中去而已。具体代码见dForm.asp。

  程序最后检查sBadForm是否为空。如不为空,则拒绝表单提交并将sBadForm写入浏览器。如果sBadForm为空,则在Records表增加一个记录保存表单数据。在保存表单内容之前需要删除隐藏域val,这个隐藏域总是表单的第一个输入域:

以下是引用片段:
  If Len(sBadForm) = 0 Then
  RS.Open "Records", DB, 3, 2, &H0002
  RS.AddNew
  RS.Fields("Record") = Mid(Request.Form, InStr(Request.Form, "&") + 1)
  RS.Fields("Created") = Now()
  RS.Fields("RemoteIP") = Request.ServerVariables("REMOTE_ADDR")
  RS.Update
  Response.Write("< H1 >谢谢.< /H1 >")
  RS.Close
  Else
  Response.Write("< H1 >表单提交失败。< /H1 >")
  Response.Write(vbCrLf & sBadForm)
  End If
  End If


  这就是服务器端表单处理的全部过程。根据是否存在已经提交的表单,我们可以把前面生成表单的代码和这里表单处理的代码用If语句封装,使得这两部分脚本共享部分公用代码,比如HTML文档的头、数据库

上一页  [1] [2] [3]  下一页