验证控件使用教程From PRADO WikiA Tutorial for Using Validators Xiang Wei Zhuo Copyright 2004. All Rights Reserved. 翻译:张祖良 (aliang.cn@gmail.com) 说明:欢迎通过邮件或者论坛方式指正翻译过程中的不当之处。
目录
1 概 述
2 验证控件和范例 2.1 TRequiredFieldValidator 2.2 TEmailAddressValidator 2.3 TRegularExpressionValidator 2.4 TCompareValidator 2.5 TRangeValidator 2.6 TCustomValidator 2.7 TValidationSummary 3 总结 4 完整代码列表 5 参考资料
概 述 Web应用程序的主要应用之一是验证用户的输入信息,以确保输入数据的完整性和安全性。 假定您从用户收集例如用户注册之类的信息,用户输入错误的或不符合格式的数据, 如错误的Email地址或邮政编码,这些信息就如同垃圾数据并且对系统造成潜在的威胁。 因此,对用户的输入信息进行验证是相当重要,至少,是输入信息格式上的验证。 验证用户输入信息的过程就是进行表单的验证。这一验证过程一般在两个位置进行, 客户端验证: 使用客户端的javascript脚本验证,和服务器端验证: 使用服务器端脚本验证,如PHP。验证输入过程中,服务器端是必须,而客户端则是可选的。如果客户端浏览器不支持javascript,则只有服务器端验证起作用。 在Prado中,当单击如 TButton,TLinkButton 或 TImageButton 控件,并且这些控件的CausesValidation属性设置为true时,执行验证操作.也可以使用TPage的validate()方法开始手动的验证。 验证控件始终在服务器端执行,也可选择javascript进行客户端的验证. 客户端验证需要比较新的浏览器的支持,如Internet Explorer 6.0, Firefox 1.0, Safari 1.2等。客户端的javascript在用户输入数据提交到服务器端前进行验证,通过客户端检测到错误,增强了验证过程的响应,避免了不必要的服务器端往返操作。 Prado 提供了一套的验证器控件,如下: Prado中验证控件及其用途列表 | 验证类名称 | 用途 | TValidator验证组件基类TRequiredFieldValidator输入控件值为非空字符串TCompareValidator比较用户输入控件包含的值,与另一个特定控件的值或常量相匹配TRangeValidator检验用户控件的输入值的在指定的上下边界范围内。TRegularExpressionValidator检验一个输入控件的值是与一个特定正则表达式相匹配。TEmailAddressValidator检验一个输入控件的值是否正确的email地址TCustomValidator执行用户自定义验证逻辑检查用户的输入 (服务器端或客户端,或两者同时执行)TValidationSummary在Web页面以摘要的形式或者弹出框方式显示所有验证控件的错误摘要信息验证在页面初始化(也就是在视图状态,Postback数据执行之后)之后,在点击或变化事件之前执行。
你可以在页面初期,比如在页面加载的过程,通过调用控件的Validate方法,执行验证操作。
如果用户的浏览器支持最新的javascript标准,客户端验证将在表单提交之前执行。只有当客户端的验证全部通过了才进行表单提交。如果浏览器不支持javascript,表单将提交并进行服务器端验证操作。服务器端的验证始终是执行的。
验证控件和范例
在Prado中,验证控件做为Web控件添加到模板文件中。我们用一个用户注册表单的验证过程做为范例,在这个范例中将用到了上述的多个验证控件。
我们想要建立下面这个简单的注册表单。
模板代码如下,另存为“ValidatorExample.tpl”文件到您的应用程序目录下。至于表单样式,就取决于你的想象能力了。
<h2>New User Registration</h2>
<com:TForm >
<fieldset>
<legend>Login details (all fields are required)</legend>
<label>Username:</label>
<com:TTextBox ID="Username" />
<label>Email Address:</label>
<com:TTextBox ID="Email" />
<label>Password:</label>
<com:TTextBox ID="Password" TextMode="Password" />
<label>Password Again:</label>
<com:TTextBox ID="PasswordCheck" TextMode="Password" />
</fieldset>
<div class="buttons">
<com:TButton Text="Register New User" OnClick="registerUser" />
</div>
<com:TLabel ID="msg" class="msg"/>
</com:TForm>
注意,在实际项目中<label>应该拥有和表单的输入控件相对应的属性值。
模板页相应的代码类如下所示,另存文件为"ValidatorExample.php"到你的应用程序目录下。
/**
* A simple example to demonstration the simplicity and
* intuitiveness of adding input validation using PRADO.
*/
class ValidatorExample extends TPage
{
/**
* Register new user event.
* Add a new user into the database.
* @param TControl sender of the event
* @param TEventParameter event parameter
*/
function registerUser($sender, $param)
{
$msg = $this->msg;
// check that all the validators were successful.
if($this->isValid())
{
// add the new user details into a database
// but for this example, we will just output a message.
$msg->setText(''''User Added'''');
$msg->setStyle(''''color:blue'''');
}
}
}
当单击"Register New User"按钮,可以看到在该按钮下方出现了"User Added"的蓝色提示消息
当前,表单没有执行验证,以下操作可能导致错误产生:
- 用户在没有任何输入情况下直接单击"Register New User"按钮。
- 用户提供了虚假的Email地址。我们需要选择Email的地址格式进行输入验证,以防止虚假的输入。
- 两次密码输入不匹配。
更多情况下,严格的输入要求列表如下:
输入字段 | 有效输入的要求 | 用户名非空字符,不能与已经存在用户名重复。Email地址非空字符,必须与预先设置email格式相匹配.一般采用默认格式。密码非空字符,字符长度大于等于六位重复密码非空字符,两次密码输入必须匹配我们将为控件逐个添加适当的验证控件。
TRequiredFieldValidator
TRequiredFieldValidator验证输入控件具有非空字符,是最简单的验证控件。为保证我们的输入控件的值是必须的,我们为每一个输入控件添加一个TrequiredFieldValidator控件,以”UserName”为例,如下:
<label>Username:</label>
<com:TTextBox ID="Username" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="Username"
Display="Dynamic"
ErrorMessage="Please choose a username." />
Where ControlToValidate is the ID of the input component that requires validation. In this case, the "Username" is a required field. 其中,ControlToValidate属性是需要验证的输入控件的ID,通过这种方式,“username”控件必需有输入值的。
每一个验证控件都拥有以下属性,这些属性定义在TValidator类中。
- ControlToValidate
- 设置被验证控件的ID路径。所谓ID路径是指从验证控件的父控件到被验证控件的ID序列(用点连接)。例如,如果HomePage是Validator和SideBar的父控件,而 SideBar是UserName的父控件,那么验证UserName所需的ID路径就"SideBar.UserName"。
- ErrorMessage
- 当验证失败时,验证控件会显示的文本消息。
- Display
- .验证控件的出错信息是否动态显示,允许以下值:None,Static和Dynamic,默认值是Static。
- None,不显示任何错误验证信息。
- Dynamic,当验证失败显示验证错误信息。
- Static,无论验证成功或失败,验证控件都显示出错信息。
(此处英文表述不恰当,实际上的效果是,Static的错误信息会占据网页空间(正常情况下并不显示)。而Dynamic的效果则是:错误信息正常情况下并不占网页空间(当然也不显示)。 )
- EnableClientScript
- 指定是否执行客户端浏览器验证。默认为 true.
除包含上述属性外, TRequiredFieldValidator增加了以下属性
- InitialValue
- 当被验证的输入控件失去焦点时,改变的值与初始值(initialValue)相匹配,验证失败。(译注:InitialValue 属性指示您不希望用户在输入控件中输入的值。当验证执行时,如果输入控件包含该值,则其验证失败。)
同样的,如下例,你可以为其他输入控件添加TRequiredFieldValidator。
<h2>New User Registration</h2>
<com:TForm >
<fieldset>
<legend>Login details (all fields are required)</legend>
<label>Username:</label>
<com:TTextBox ID="Username" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="Username"
Display="Dynamic"
ErrorMessage="Please choose a username." />
<label>Email Address:</label>
<com:TTextBox ID="Email" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="Email"
Display="Dynamic"
ErrorMessage="Please enter your email address." />
<label>Password:</label>
<com:TTextBox ID="Password" TextMode="Password" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="Password"
Display="Dynamic"
ErrorMessage="Please choose a password with 6 or more characters." />
<label>Password Again:</label>
<com:TTextBox ID="PasswordCheck" TextMode="Password" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="PasswordCheck"
Display="Dynamic"
ErrorMessage="Please re-enter your password." />
</fieldset>
<div class="buttons">
<com:TButton Text="Register New User" OnClick="registerUser" />
</div>
</com:TForm>
在没有任何输入的情况下,单击"Register New User"按钮,验证器将被触发,并动态显示错误信息。如果您的浏览器支持javascript,表单将不被提交,验证器在客户端运用javascript进行验证操作。
接下来是验证用户名的唯一性,我们需要检测输入的用户名是否已经被注册。如果用户名已经存在数据库中,我们需要一个自定义的验证控件。我们将在下面的章节中介绍自定义控件的使用。
TEmailAddressValidator
在我们的范例中,下一个需要验证的是Email地址的输入控件,验证email地址的正确性是单调乏味和复杂的。简单一点,我们只需要检测 email地址是否一个字符串形式。稍微复杂一点的,需要检测这个email地址是否已经存在,这个一过程包含了验证服务器端该email地址是否已经存在并且该用户帐号是有效的。
PRADO支持使用正则表达式进行简单的email地址的匹配验证。另外,如果您服务器上安装的php支持checkdnsrr函数,PRADO可以通过检测DNS记录来验证该email地址的服务器是否存在。
我们通过默认的匹配模式来验证email地址,举例如下:
<label>Email Address:</label>
<com:TTextBox ID="Email" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="Email"
Display="Dynamic"
ErrorMessage="Please enter your email address." />
<com:TEmailAddressValidator
ControlToValidate="Email"
Display="Dynamic"
ErrorMessage="Please check your email address for typing errors." />
采用默认的email地址的正则表达式进行匹配验证是很高效的。你可以设置RegularExpression属性自定义正则表达式。可以通过http://regexlib.com/查找更多的email地址和其他的正则表达式。
TRegularExpressionValidator
介绍完email地址的验证控件,我们看看TEmailAddressValidator控件的基类(父类)正则表达式验证控件,该控件在其基类(TValidator)基础上增加了以下属性:
- RegularExpression
- 被验证的控件相匹配的正则表达式,一些常用的正则表达式如下: