验证控件使用教程From PRADO Wiki
A 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
验证组件基类
输入控件值为非空字符串
比较用户输入控件包含的值,与另一个特定控件的值或常量相匹配
检验用户控件的输入值的在指定的上下边界范围内。
检验一个输入控件的值是与一个特定正则表达式相匹配。
检验一个输入控件的值是否正确的email地址
执行用户自定义验证逻辑检查用户的输入 (服务器端或客户端,或两者同时执行)
在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被验证的控件相匹配的正则表达式,一些常用的正则表达式如下: Email地址: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* Internal URL地址: http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 日本电话号码: (0\d{1,4}-|\(0\d{1,4}\) ?)?\d{1,4}-\d{4} 日本邮编: \d{3}(-(\d{4}|\d{2}))? 中国电话号码: (\(\d{3}\)|\d{3}-)?\d{8} 中国邮编: \d{6} 中国社保号码: \d{18}|\d{15} 美国电话号码: ((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4} 美国邮编: \d{5}(-\d{4})? 美国社保号码: \d{3}-\d{2}-\d{4} 可以网上可以找到更多的正则表达式,如 http://regexlib.com/
下例所示,我们使用正则表达式验证密码字符个数。
<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." />
<com:TRegularExpressionValidator
ControlToValidate="Password"
RegularExpression="[\w]{6,}"
Display="Dynamic"
ErrorMessage="Your password must have at least 6 characters." />
正则表达式"[\w]{6, }" 匹配验证至少六个的非空字符。(译注:原文有误?正则表达式\w 指字母、数字和下划线组任一字符)正则表达式"[\w]" 定义了非空字符,如,你可以定义该字符为a-z任一字母 "[a-z]". 表达式 "{6, }" 检测重复的次数,在这个表达式中重复出现六次以上。例如,假定把表达式改为 "{3,6}"将检测重复出现3-6次之范围内。可以通过www.google.com通过搜索“regular expression”在网上找到更多的正则表达式。
TCompareValidator TCompareValidator验证控件用于两个输入控件的数值,或输入控件和特定常量的数值的比较。
范例中,有两个密码输入框,“password”和“password again”.第二个密码输入框用于确保用户密码输入的正确性。通过比较两个密码输入值进行验证,当两个数值相同,验证有效。TCompareValidator 控件可以通过多种方式进行比较比较两个输入控件,下面将详细说明。以下是TcompareValidator在其父类[#tvalidator TValidator].的基础上增加的属性。
ControlToCompare对比验证输入控件的Id。 ValueToCompare和用户输入控件值进行验证比较的常量。 ValueType在进行比较验证前进行转化的数据类型(整型,浮点型,货币型,日期型,字符型)。 Operator执行验证比较的操作(等于,不等于,大于,大于等于,小于,小于等于,数据类型检测)。 事实上,TcompareValidator能执行多种比较验证,以下范例是简单的比较数值。
<label>Password:</label>
<com:TTextBox ID="Password" TextMode="Password" /> <br />
...
<label>Password Again:</label>
<com:TTextBox ID="PasswordCheck" TextMode="Password" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="PasswordCheck"
Display="Dynamic"
ErrorMessage="Please re-enter your password." />
<com:TCompareValidator
ControlToValidate="PasswordCheck"
ControlToCompare="Password"
Display="Dynamic"
ErrorMessage="Your password entries did not match." />
设置ControlToValidate属性为输入控件ID指定需要验证的控件,设置ControlToCompare属性为另外一个控件的ID来指定用于比较的输入控件。
在上例中,TCompareValidator设置为需要比较验证的PasswordCheck输入控件Id, 用Password的输入值和PasswordCheck的输入值进行比较,如果相同,验证有效。
也可以通过设置ValueToCompare属性,进行输入控件的常量比较。
ValueType属性用于指定比较数值类型,两个比较数值先被自动转化为设置的数值类型,然后执行比较操作。以下是所支持的数据类型。
整型32字节带符号整型。 双精度型双精度浮点数值类型。 货币型包含货币符号的十进制数据类型。 时间型时间类型,按GNU进行日期定义,由于strtotime 函数的bug,,当设定时间时,不包含时,分和秒。 字符型字符类型。 使用Operator属性设定进行比较的操作类型,如等于,不等于,大于,大于等于,小于,小于等于,数据类型检测等。如设置了 DataTypeCheck,TcompareValidator控件将忽略ControlToCompare和ValueToCompare属性,仅仅显示控件的输入的值是否能转化为ValueType指定的数据类型。
注意:如果输入控件输入值为空,不会进行任何验证函数,验证返回成功。应该使用RequiredFieldValidator控件用户输入数据的非空检测。
TRangeValidator TRangeValidator验证控件检测输入控件的值是否在指定范围内。该控件采用三个主要的属性完成验证操作。MinValue和MaxValue属性指定验证有效范围的最小值和最大值,ValueType属性指定比较的数据类型,数据的类型将在执行验证操作前转化为此类型,该属性支持的类型和TCompareValidator的ValueType是一致的。
TRangeValidator其父类验证控件[#tvalidator TValidator]的基础上增加以下属性:
MinValue验证范围的最小值 MaxValue验证范围的最大值 ValueType验证前转化的数据类型 (整型, 浮点型, 货币型, 日期型, 字符型) 以下范例演示了如何在Web页面中采用TRangeValidator控件验证输入控件的输入范围:
<h3>RangeValidator Example</h3>
<com:TForm >
<label>Enter a number from 1 to 10:</label>
<com:TTextBox ID="TextBox1" />
<com:TRangeValidator
ControlToValidate="TextBox1"
MinValue="1"
MaxValue="10"
ValueType="Integer"
Display="Dynamic"
ErrorMessage="The value must be from 1 to 10!" />
<br />
<com:TButton Text="Test Range Validator" />
</com:TForm>
TCustomValidator 在很多情况下,我们需要自定义验证控件,例如,我们需要验证注册用户输入的用户名的唯一性。这一过程需要把用户名和用户数据列表进行对比验证,假设用户数据存储在数据库中的。TCustomValidator控件为用户输入控件提供了自定义的验证函数。该验证过程和输入控件分离,你可以选择验证消息显示的位置。TCustomValidator在其父组件TValidator的基础上增加了以下的属性和事件:
ClientValidationFunction用于进行客户端验证的函数名称。 OnServerValidate (event)当服务器端执行验证时触发该事件。当验证结果失败时,事件委托设置TServerValidateEventParameter.isValid的值为flase。 提供OnServerValidate的验证处理事件,需要创建服务器端的验证函数。TServerValidateEventParameter类型的事件参数将访问被验证的输入控件的数据,结果将保存在事件参数的isValid属性中。
创建客户端的验证函数,首先,添加上文所述的服务器端验证函数;其次,添加客户端验证脚本函数到模版页面,或通过Php重载页面的onPreRender函数添加javascript函数。 该函数如下所示:
<script type="text/javascript">
<!--
function ValidationFunctionName(sender, parameter)
{
//if the parameter value is true
if(parameter == ... )
return true;
else
return false;
}
-->
</script>
使用ClientValidationFunction 控件的ClientValidationFunction属性指定客户端验证的脚本函数的名称。
继续以新用户注册为例,我们需要输入用户名的唯一性,在模板页面中添加以下自定义控件:
<com:TCustomValidator
ControlToValidate="Username"
ClientValidationFunction="checkUsernameJS"
OnServerValidate="checkUsername"
Display="Dynamic"
ErrorMessage="Username exists, please try a different username." />
在这里,服务器端的验证调用 checkUsername函数(Php中执行),客户端的验证调用checkUsernameJS函数(javascript中执行)。Php代码如下,注意到javascript代码是写在php代码中的,同样的我们可以把它写到模板文件中。
/**
* Check if the username exists.
* @param TControl sender of the event
* @param TServerValidateEventParameter event parameter
*/
function checkUsername($sender, $param)
{
//assume the username can be checked against a database
//or some other datasource. For the example, we will
//just do a simple comparison. If the value equals "admin"
//the validation failed.
if($param->value == 'admin')
$param->isValid = false;
}
/**
* Overrides parent implementation by registering a Javascript
* for custom validation.
* @param TEventParameter the event parameter
*/
function onPreRender($param)
{
parent::onPreRender($param);
$page=$this->getPage();
//javascript checkUsername, Lets assume that XMLHttpRequest
//can be used to check the username. For the example,
//we will just do a simple comparison in javascript
$jscript="
function checkUsernameJS(sender, parameter)
{
if(parameter == 'admin')
return false;
else
return true;
}
";
$page->registerEndScript('checkUsername',$jscript);
}
注意,我们把javascript添加到php中,重载onPreRender函数,并使用$page->registerEndScript函数添加javascript。同样的,javascript将被添加到模板中。
当创建客户端验证函数时,务必也包括服务器端验证函数。如果您创建的客户端的验证函数不包括相应的服务器端函数,恶意的代码将有可能绕过验证。
TValidationSummary TValidationSummary控件以Web页面内显示,弹出窗口或两者同时显示的方式显示所有的验证错误小结信息。该小结信息由DisplayMode属性决定以List,bulleted或single paragraph格式显示。通过分别设置 ShowSummary 和ShowMessageBox属性可以以Web页或者弹出框的方式显示信息。
TValidationSummary类以TwebControl为基类,它拥有以下的属性:
DisplayMode验证小结的显示模式(BulletList,List,SingleParagraph)。 HeaderText在验证小结信息顶部显示的标题文字。 EnableClientScript指明TvalidationSummary是否采用客户端代码,布尔型(True 或False)数值。 ShowMessageBox指明是否显示弹出框,布尔型(True 或False)数值,如果EnableClientScript已经设置为Flase,该属性不起作用 ShowSummary指明验证小结信息是否在页内显示,布尔型(True 或False)数值 以下范例,在页面显示错误列表信息:
<com:TValidationSummary DisplayMode="BulletList"/>
总结 验证控件对相关的输入控件始终执行服务器端验证。客户端的验证避免了服务器端不必要的的往返操作,从而增强验证过程的响应。
多个验证控件通过不同的标准可以对单一的输入控件进行验证。比如,你可以通过多个验证控件对添加记录数量到购物车的TTextBox数值进行验证控制,添加TRangeValidator控件和TRequiredFieldValidator控件确保TTextBox控件输入指定的范围数值和输入非空的数值。
当输入控件验证失败,ErrorMessage属性设定的文字将在验证控件处显示。当Web页面上同时存在TValidationSummary控件时,该文字也将同时在该控件处显示。
N.B.当输入控件为空时,将不调用任何验证函数,验证返回成功。采用RequiredFieldValidator控件要求用户输入非空字符。
Prado提供了一套基本的验证工具对用户输入进行简单而高效的操作。通过对表单输入的必须的验证,以确保数据的完整性和应用程序的安全性。但是,必须注意一点,验证操作并不完全覆盖了Web应用程序安全的所有方面。
完整代码列表 以下列出本文演示范例中完整的php和template代码。
ValidatorExample.php
<?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');
}
}
/**
* Check if the username exists.
* @param TControl sender of the event
* @param TServerValidateEventParameter event parameter
*/
function checkUsername($sender, $param)
{
//assume the username can be checked against a database
//or some other datasource. For the example, we will
//just do a simple comparison. If the value equals "admin"
//the validation failed.
if($param->value == 'admin')
$param->isValid = false;
}
/**
* Overrides parent implementation by registering a Javascript
* for custom validation.
* @param TEventParameter the event parameter
*/
function onPreRender($param)
{
parent::onPreRender($param);
$page=$this->getPage();
//javascript checkUsername, Lets assume that XMLHttpRequest
//can be used to check the username. For the example,
//we will just do a simple comparison in javascript
$jscript="
function checkUsernameJS(sender, parameter)
{
if(parameter == 'admin')
return false;
else
return true;
}
";
$page->registerEndScript('checkUsername',$jscript);
}
}
?>
ValidatorExample.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Prado Validation Example</title>
<style type="text/css">
/*<![CDATA[*/
body
{
padding: 2em;
font-family: Georgia,"Times New Roman", Times, serif;
}
.msg
{
font-size: 1.2em;
font-weight: bold;
margin-bottom: 1em;
}
.buttons
{
padding: 2em;
text-align: center;
width: 20em;
}
label
{
display: block;
margin-top: 1.5em;
font-size: 0.75em;
font-weight: bold;
padding-bottom: 0.2em;
}
legend
{
padding: 0 0.5em;
}
fieldset
{
padding: 1em 2em 2em 2em;
width: 20em;
}
span
{
font-size: 0.75em;
}
.msg
{
display: block;
}
/*]]>*/
</style>
</head>
<body>
<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." />
<com:TCustomValidator
ControlToValidate="Username"
ClientValidationFunction="checkUsernameJS"
OnServerValidate="checkUsername"
Display="Dynamic"
ErrorMessage="Username exists, please try a different username." />
<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." />
<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." />
<com:TRegularExpressionValidator
ControlToValidate="Password"
RegularExpression="[\w]{6,}"
Display="Dynamic"
ErrorMessage="Your password must have at least 6 characters." />
<label>Password Again:</label>
<com:TTextBox ID="PasswordCheck" TextMode="Password" /> <br />
<com:TRequiredFieldValidator
ControlToValidate="PasswordCheck"
Display="Dynamic"
ErrorMessage="Please re-enter your password." />
<com:TCompareValidator
ControlToValidate="PasswordCheck"
ControlToCompare="Password"
Display="Dynamic"
ErrorMessage="Your password entries did not match." />
</fieldset>
<div class="buttons">
<com:TButton Text="Register New User" OnClick="registerUser" />
</div>
<com:TLabel ID="msg" class="msg"/>
</com:TForm>
</body>
</html>
参考资料 PRADO component framework for PHP 5 http://www.xisc.com/ Web Form Validation in ASP.NET http://tinyurl.com/58nhy Regular Expression Library http://regexlib.com/ Easier form validation with PHP http://tinyurl.com/69eru