下载 PDC_userinput.exe 示例文件 (44 KB)。
内容:
简介
对用户输入进行验证是基于 Web 的应用程序中常见的情况。为了开发应用程序,开发人员经常在这项工作中花费大量的时间和编辑大量的代码,比我们希望的多得多。在 ASP+ 页面架构的构建过程中,努力使输入验证这一任务比以前更容易是很重要的。
问题
在 HTML 3.2中,验证数据是一个困难的过程。每次得到请求后,您需要编写代码来检查输入并向页面返回用户的错误,帮助用户正确填写验证窗体。对于最终用户、开发人员和服务器来说,这实在是一个繁杂的过程。
DTHML 和脚本语言使这一局面有所改善。它们在出现输入错误时可以立即反馈到用户,并在未改正前阻止用户发布页面。但是,这几乎不可能保证站点的每一个用户都拥有所需的脚本设计环境。这通常意味着,如果您要使用脚本改善网页的界面,就必须分别在客户机和服务器编写两次同样的验证逻辑,以防止无法执行客户机代码。
目标
对于验证,我们的目标是:
- 为数据输入页面提供可以完成 90% 或更多典型验证任务的组件。
- 让这些组件在新型浏览器上执行充分的基于脚本的验证,在需要时,这些浏览器可以有效地退回到纯 HTML 3.2 基于服务器的验证。
- 提供一个灵活的 API,以便轻松完成组件未包括的任何验证任务。
我们访问了大量实际的网页来确定这些组件应该能够处理的场景。我们的目标是在今后的应用程序中极大地减少验证代码。
解决方案概述
验证器控件是此解决方案的主要部分。验证器是一个可视的 ASP+ 控件,它用来检查另一个控件的特定验证条件。它通常以一段文字的形式出现在用户面前,根据它正在检查的控件是否发生错误来显示或隐藏。它也可以是一幅图像,甚至也可以不可见,但仍然做有用的工作。有五种可以执行不同类型检查任务的验证器控件。
解决方案的另一个元素是 ValidationSummary 控件。大的数据输入页面通常有一块列出所有错误的区域。ValidationSummary 通过从页面上的验证器控件自动收集并生成其中的内容。
解决方案的最后一个元素是页面对象自身。它显示最重要的“IsValid”属性,可以在服务器代码中检查并确定用户输入是否正确。
客户机特性
大多数网站在服务器上执行验证检查,您无论如何都要为无脚本的客户机编写基于服务器的检查,因此很难判断是否要为所有胖客户机重写所有检查。
验证控件改变了这一切,因为几乎所有重复的逻辑都封装在控件中。如果一个使用 IE 4.0 或更新版本的客户机使用了您的页面,那么它可以执行与在服务器上相同的验证,而无需编写任何特殊的客户机脚本。
客户机端验证过程包括以下几个特性:
- 错误信息会随着非法输入的键入或改正而立即出现或消失。这种即时反馈使改正错误输入变得更加容易。
- 在客户机上有可检测到的错误时发生的“退回”可以得到避免,这节省了用户时间并减少了服务器上的点击次数。
- 如果 ValidationSummary 检测到错误,它只是更新自己而不退回。
- 如果有错误,ValidationSummary 可以选择向用户显示一个消息框。
- 客户机逻辑完全包含在一个 JScript 库中, 因此不使用 ActiveX 组件或 Java 小程序。
- 也可以选用 VBScript 来执行涉及本地化日期的检查和数字比较。
- 在客户机上展示一个对象模型,以增强客户机端的验证和行为。
什么是验证器?
为了有效地使用验证器,给出其严格的定义是很有帮助的,让我们提炼一下以前给出的定义:
“验证是一个控件,它在一个输入控件中检查某种特定类型的错误条件,并显示该问题的说明。”
这是一个重要的定义,因为它意味着您经常需要为每个输入控件使用多个验证器控件。
例如,如果您要检查文本框中的用户输入是否为 (a) 非空,(b) 在特定范围中的合法日期,或 (c) 小于在另一文本输入控件中的日期,那么您可能要使用三个验证器。这也许显得有些繁琐,但请记住这对用户是有帮助的,对所有这些情况您可能要使用三种不同的文本说明。
下面列出几种不同的验证器:
RequiredFieldValidator | 检查用户是否输入或选择了任何内容 |
RegularExpressionValidator | 根据规则表达式检查用户输入。该过程允许进行许多种类的检查,可以用于邮政编码和电话号码等的检查。 |
CompareValidator | 将输入控件与一个固定值或另一个输入控件进行比较。例如,它可以用在口令验证字段中。也可以用来比较输入的日期和数字。 |
RangeValidator | 与 CompareValidator 非常相似, 只是它用来检查输入是否在两个值或其它输入控件的值之间。 |
CustomValidator | 允许用户编写自己的代码以加入到验证框架中。 |
验证器演示
为了示范验证任务,我们将概要介绍向现有页面添加验证的过程。以下是一些必需条件的示例:
编写一个 Web 页面来收集新的用户 id 和口令。用户 id 必须包含 6-10 个字母字符,且必须是未使用的。口令必须包括 4-12 个字母,其中至少有一个数字和一个“@#$%^&*/”中的字符。用户必须再次输入口令以确保输入无误。
我将从一个 HTML 页面开始,该页面已做了最小程度的转换以适用于 ASP+ 页面框架。
转换页面的过程包括下述步骤:
- 将扩展后缀从“.html” 或“.asp” 转换为“.aspx”。
- 将窗体模板和所有输入标签改为“runat=server”。
- 使用“ID” 而不是“name”。
起始代码:
<html>
<head>
<title>验证示例;/title>
</head>
<body>
<p>请输入新的用户 ID 和口令</p>
<form runat=server>
<table>
<tr>
<td>用户 ID </td>
<td><input type=text runat=server id=txtName></td>
</tr>
<tr>
<td>口令 </td>
<td><input type=password runat=server id=txtPWord></td>
</tr>
<tr>
<td>请重新输入口令 </td>
<td><input type=password runat=server id=txtRePWord></td>
</tr>
<table><br>
<input type=submit runat=server id=cmdSubmit value=Submit>
</form>
</body>
</html>
起始页:
并非自愿
我们首先要强制使所有字段都已填充。
在每一个字段前添加 RequiredFieldValidator。若输入字段为空,我们要在字段前显示一个星号(*),并在摘要区域报告文本错误。以下是向 User ID 字段添加 RequiredFieldValidator 控件的方法:
<tr>
<td>
<asp:RequiredFieldValidator runat=server
ControlToValidate=txtName
ErrorMessage="需要用户 ID。"> *
</asp:RequiredFieldValidator>
</td>
<td>User ID:</td>
<td><input type=text runat=server id=txtName></td>
</tr>
若输入为空,则在标签旁边显示 *。出错消息在摘要中报告。“ControlToValidate”属性指定了需要验证的控件 ID。最后一步是向页面顶部添加验证总结,如下所示:
<asp:ValidationSummary runat=server
headerText=此页有错误:/>
该页面如下所示:
规则化
下一步我们需要强调用户 ID 和口令字段的要求。对这些字段,要使用 RegularExpressionValidator 控件。规则表达式在此类信息的简明表达检查中非常有效,这些信息还包括邮政编码、电话号码和电子邮件地址。
下面显示了如何指定对用户 ID 的限制:
<td>
<input type=text runat=server id=txtName>
<asp:RegularExpressionValidator runat=server
ControlToValidate="txtName"
ErrorMesage="口令必须由 6-10 个字母组成。"
ValidationExpression="[a-zA-Z]{6,10}" />
</td>
注意在本示例中,我们并没有指定标记内的任何内部内容。内部文本等同于控件的“文本属性”。如果它为空,出错信息将显示在控件所在的位置,同样它也出现在摘要中。
可以用下面两个验证器来检查口令。如果您使用了多个验证器,则只有它们全都匹配时,才可以认为输入是有效的。
<asp:RegularExpressionValidator runat=server display=dynamic
ControlToValidate="txtPWord"
ErrorMessage="口令必须包含 @#$%^&*/ 中的一个。"
ValidationExpression=".*[@#$%^&*/].*" />
<asp:RegularExpressionValidator runat=server display=dynamic
ControlToValidate="txtPWord"
ErrorMessage="口令必须是 4-12 个非空白字母。"
ValidationExpression="[/S{4,12}" />
这是操作中带有表达式的窗体。
逐一比较
我们需要确认口令的重新输入字段与口令匹配。需要使用 CompareValidator 控件完成此操作。因为它能够同时处理两个输入控件。
<asp:CompareValidator runat=server
ControlToValidate=txtRePWord
ControlToCompare=txtPWord
ErrorMessage="口令不匹配。" />
默认情况下,CompareValidator 只做简单的字符串匹配比较。如果需要,它可进行涉及日期和数字的更复杂的比较。
符合习惯
我们需要检查的最后一件事是名称尚未在假想的站点中使用。这要继续在服务器上查找一些数据。为了模拟此操作,我在服务器端的代码段中创建一个哑函数来检查第一个字符是否不是“a”。下面的 Visual Basic 函数在页面上定义:
public function CheckID(source as Object, value as String) as Boolean
return value.substring(0, 1).tolower() <> "a"
end function
要调用这一函数,我将添加一个 CustomValidator,它用于调用开发者的代码来执行检查。以下是它的声明:
<asp:CustomValidator runat=server
controltovalidate="txtName"
errormessage="ID 已经在使用。"
OnServerValidationFunction="CheckID" />
它也可以调用客户机脚本中的定制函数,尽管如果它必须在数据库中查找值时这会不太实用。在有脚本的客户机上,在其它所有验证器先在客户机上执行检查后才允许提交。如果只在服务器上进行的检查检测到这样的错误,则会向用户返回页面指出这些错误。
尾声
现在,唯一剩下的事就是使用经过精细验证后的数据了。您需要做的只是检查页面的 IsValid 属性,判定是否可以进行数据库的更新。您提交的处理程序可能类似下面的形式:
public sub OnSubmit(source as Object, e as EventArgs)
if Page.IsValid then
'现在我们可以执行事务。
end if
end sub
正如您所看到的那样, 该处理程序允许数据输入页包含特定于您应用程序的代码,而不是通篇代码都来处理一般的输入检查。
以下是关于最终活动页面的其它一些信息: