三、动态生成表单
生成表单时,程序按照Definitons表中的各个输入域定义记录,依次生成相应的表单HTML代码和javascript代码。HTML代码中首先要生成的是文本标签:
以下是引用片段: sHTML=sHTML&vbTab&"<TR>"&vbCrLf&vbTab&vbTab sHTML=sHTML&"<TDVALIGN="&Chr(34)&"TOP"&Chr(34) sHTML=sHTML&">"&vbCrLf&vbTab&vbTab&vbTab sHTML=sHTML&"<B>"&RS.Fields("Label") |
然后程序检查当前输入域是否必须输入。如果必须,则在标签文本之后加一个星号(表示该值必须输入),同时对于必须输入的值,还要生成相应的javascript代码来验证它。对于单选按钮或选择列表,需进一步检查用户确实选择了某个选项;对于所有其他输入类型,只要检查输入值不为空即可。
紧接文本标签的是表单的输入元素,这些元素的HTML代码根据Definitions表中指定的类型和属性生成。再接下来就是根据输入值要求生成执行客户端验证任务的javascript代码。对于本例,只有数字型的值需要进一步检查以保证用户的输入确实是数字,而且数字值在许可的最大值和最小值之间。生成上述代码之后,就可以结束一个表格行(也就是一个输入域)继续处理Definitions表的下一个记录。一旦所有的数据库记录处理完毕,下一步就可以加入“提交”按钮和“清除”按钮的HTML代码。如果换个角度来看,程序在这里的任务就是根据数据库记录生成各个输入域,每个输入域占用一个表格行,每个表格行二个单元:第一个单元用来显示文本标签,第二个单元显示输入元素本身(代码见dForm.asp)。
上述过程结束之后,表单的HTML代码和验证用javascript函数分别保存到了变量sHTML和sjavascript中。在把这些内容写入页面之前,程序检查客户端是否要求执行javascript验证,如果不要求执行这类验证,则清除sjavascript变量:
If iValType = 0 Or iValType = 2 Then sjavascript = ""
在输出BODY标记之后,程序输出如下javascript函数:
以下是引用片段: <SCRIPTLANGUAGE="javascript"> <!-- functionvalidate(TheForm){ //客户端表单验证 <%=sjavascript%> returntrue; } functionCheckRadio(objRadio){ //单选按钮中是否有某个值被选中 for(varn=0;n<objRadio.length;n++){ if(objRadio[n].checked){ returntrue; } } returnfalse; } functionCheckList(objList){ //是否已经在选择列表中选择了某个值 for(varn=1;n<objList.length;n++){ if(objList.options[n].selected){ returntrue; } } returnfalse; } //--> </Script> |
如果客户端不需要javascript验证,则validate函数只剩下一个“return true”语句。上面代码中的后面两个静态javascript函数(CheckRadio和CheckList)用于验证单选按钮和下拉列表框,当这两种输入域需要验证时validate函数将调用它们。
现在可以开始把表单写入页面:
< FORM ACTION="./dform.asp" METHOD="POST" NAME="MyForm" onSubmit="return validate(this)" >
在这里,只有当validate函数返回true时才执行表单提交操作。因此当客户端javascript验证功能关闭时,validate函数将自动返回true。
接下来要加入的是名为val的隐藏域。如前所述,该值指示表单的验证模式。
< INPUT TYPE="HIDDEN" NAME="val" VALUE="< %=iValType% >" >
当用户提交表单时,处理脚本将根据该值确定是否执行服务器端验证。
然后输出的是表格标记以及表格标题。标题保存在变量sTitleLabel中,该值在脚本开始执行时初始化:
以下是引用片段: <TABLEBORDER="0"> <TR> <TDCOLSPAN="2"ALIGN="CENTER"> <H2><%=sTitleLable%></H2> </TD> </TR> |
作为改进措施,可以在表Definitions、Lists和Records中增加一个字段FormID。FormID唯一标识一个表单,这样程序就可以同时地定义多个表单、保存多个表单的用户应答结果。至于上面的sTitleLabel,我们可以用另外一个表(比如Forms)来保存。
紧接着表格标记和表格标题,程序输出的是HTML表单以及“提交”、“清除”按钮的代码。在此之后,程序检查sHTML字符串中是否包含“*”,如包含的话说明表单中存在必须输入的内容,此时就输出一个脚注以说明该星号的含义。
以下是引用片段: <%=sHTML%> <TR> <TDCOLSPAN="2"ALIGN="CENTER"> <INPUTTYPE="SUBMIT"VALUE="提交表单"><INPUTTYPE="reset"VALUE="清除"> </TD> <% '是否存在必需输入的表单域,如存在,则输出表单脚注解释'*'的含义 IfInStr(sHTML,"*")Then %> </TR> <TDCOLSPAN="2"ALIGN="CENTER"> <FONTSIZE="2">注意:有星号标记的值必需输入。</FONT> </TD> </TR> <% EndIf %> </TABLE> </FORM> |
至此为止,表单的生成任务已经完成。 上一页 [1] [2] [3] [4] |