< 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文档的头、数据库对象的创建和资源释放等。
总地看来,dForm.asp只具备了动态表单生成、验证所必需的核心功能,忽略了许多细节问题的处理。比如前面已经提到的多表单问题:增加一