本文介绍基于ASP和Access数据库的动态表单生成系统。通过定义字段类型、验证规则及选项数据,程序可自动生成HTML表单及客户端JavaScript验证代码。系统支持四种验证模式(无、仅客户端、仅服务器、双重验证),并演示了如何根据表单提交状态切换生成或处理逻辑,适用于频繁变动的调查或注册场景。
动态表单生成系统概述
所谓复杂表单,是指包含多种输入类型的表单,例如下拉列表、单行文本框、多行文本框以及数值输入等。在需要频繁更换此类表单的应用场景中,开发一个能够动态生成表单的程序显得尤为重要。本文介绍的正是这样一个系统:它利用数据库存储表单定义数据,并通过ASP脚本动态生成对应的HTML表单代码以及用于验证用户输入的脚本。
数据库表结构设计
一、定义数据库表结构
在Web应用中,诸如“每周调查”之类的表单十分常见,这类表单通常需要频繁更新。如果拥有一套能够动态生成表单及其验证脚本的程序,将大幅降低制作此类表单的工作量。
在本示例的动态表单生成与验证系统中,我们采用Access数据库来存储表单的定义信息。为了简化设计,用户提交的数据也保存在同一数据库中。定义表单主要涉及两个表:第一个表(Definitions)用于定义表单中的输入域,第二个表(Lists)则保存各个输入域的附加信息,例如下拉列表的具体选项。
表Definitions包含以下字段:
FieldName —— 表单输入域对应的变量名
Label —— 显示在输入域前的提示性文本标签
Type —— 单个字符,用于标识表单输入域的形式及输入值的类型
具体类型定义如下:
(t) 文本输入框,对应HTML标签 < INPUT TYPE="TEXT" >。
(n) 文本输入框,但强制要求输入数字值。
(m) 备注型内容,用于注释或大量文本输入,表现为一个多行文本编辑框。
(b) 要求输入“是”或“否”。本实现中使用复选框来获取此类输入,复选框的标签为“是”。若用户选中该复选框,返回值为“on”。
(r) 单选按钮。
(l) 下拉列表框。
Min —— 仅对数字型输入有效,指定最小值。例如,示例中有一个“Age”(年龄)字段,其Min值设定为1。
Max —— 该字段的含义随输入域形式而异。对于数字型输入框,Max表示允许的最大值(如“Age”的Max值为100);对于文本输入框,Max表示允许的最大字符数;对于多行文本编辑框,Max表示可见区域的行数。
Required —— 标识该字段是否必填。若未输入此类值,验证程序将报错。在生成的表单中,必填字段以星号标记,并通过脚注提示用户。
本文的示例表单为“ASP程序员调查表”,其在Definitions表中的定义主要如下:
FieldName Label Type Min Max Required
Name 姓名 文本(t) - 50 否
Age 年龄 数字(n) 1 100 否
Sex 性别 单选按钮(r) - - 是
E-mail 邮件地址 文本(t) - - 是
Language 编程语言 下拉列表框(l) - - 否
表Lists用于保存输入域定义的附加信息,本例中“Sex”和“Languages”两个输入域用到了它。该表结构非常简单,仅包含以下三个字段:
FieldName —— 标识当前记录所属的表单输入域
Value —— 选择项的实际值
Label —— 用户可见的选择项提示文本
输入域“Sex”仅允许从两个值中选择:“男”或“女”。“Language”列出了几种适用于ASP环境的编程语言,包括:VBScript、JavaScript、C、Perl以及“其他”。
第三个表“Records”用于保存用户提交的内容,它包含三个字段,每条记录对应用户的一次提交:
Record —— 备注类型,以查询字符串形式保存的用户输入数据。
Created —— 用户提交表单的日期和时间。RemoteIP —— 提交者的IP地址。
在实际应用中,可能需要收集更多用户信息。为简化示例,本例仅记录提交时间和用户IP地址这两个附加信息。
ASP脚本核心逻辑与验证处理
二、准备工作
完成上述数据结构和表单定义后,接下来即可编写脚本。脚本的主要任务是生成表单以及处理用户提交的表单数据。
无论是生成表单还是处理表单,以下三个任务都是必不可少的:首先是确定验证类型。在生成表单时,验证类型通过查询字符串获取;在处理表单时,则从表单隐藏域读取。程序支持四种验证方式:不进行验证、仅客户端JavaScript验证、仅服务器端ASP脚本验证、以及客户端和服务器端双重验证(代号分别为0到3)。若未在查询字符串中指定合法验证方式,则默认采用第四种验证方式。这种灵活的处理机制允许在客户端禁用JavaScript时,仅在服务器端执行验证。确定验证类型的代码如下:
检查验证类型
以下是引用片段:
iValType = Request.QueryString("val")
If IsNumeric(iValType) = False Then iValType = 3
If iValType > 3 or iValType < 0 Then iValType =3
第二个任务是打开数据库连接,并创建两个记录集对象:RS对象是本程序的主要记录集,用于操作Definitions表;RSList对象主要用于从Lists表读取数据。示例程序提供了两种数据库连接方式:使用ODBC DSN或不使用ODBC DSN(若使用DSN,需先创建名为Dynamic的DSN,相关代码已被注释)。
第三个任务是在生成(或处理)表单脚本的前后输出一些静态HTML代码,例如< HEAD >< /HEAD >,并在脚本结束时释放RS、RSList等对象占用的资源。
除完成上述任务的代码外,示例应用中其余ASP脚本可能生成的页面有两种类型:提问表单(见上图)以及表单提交后的结果页面(后者同时负责记录用户提交结果)。确定运行哪部分脚本的最简单方法是检查表单是否已提交:若已提交,则处理表单;否则生成表单。
是生成表单还是处理表单?
If Len(Request.Form) = 0 Then
'生成表单
...略...
Else
'处理表单
...略...
End If
23下一页阅读全文