4.6 自定义逻辑验证控件:CustomValidator
如果对上面的各种验证控件执行的验证类型都不满意,或者说根本满足不了你的要求,那么CustomValidator验证控件一定不会让你失望。与上面所讲的验证控件相比,CustomValidator验证控件允许你根据自己的需要,定义客户端和服务器端验证子程序。然后将客户端和服务器端验证子程序与CustomValidator验证控件关联起来以便验证可自动执行。同其他控件一样,如果检查失败,Page.IsValid设为false。
CustomValidator验证控件的客户端验证子程序和服务器端验证子程序相似。它们都要接受两个参数:一个是对验证器的引用,另一个是自定义参数的对象。格式如下:
<script type="text/javascript"language="javascript">
function ValidationFunctionName(source, arguments)
{
//客户端验证代码
}
</script>
与服务器端验证类似,可以使用arguments参数的Value属性访问要验证的值。通过设置arguments参数的IsValid属性来返回验证结果。例如,下面的客户端JavaScript的验证子程序将检查输入的数字是否是2的倍数:
<script type="text/javascript"language="javascript">
function ClientValidate(source, arguments){
if(((aguments.Value%2)==0){
arguments.IsValid=true;
}
else{
arguments.IsValid=false;
}
}
</script>
编写好客户端验证子程序后,可以通过CustomValidator验证控件的ClientValidation Function属性将该客户端验证子程序关联起来,如ClientValidation Function="ClientValidate",这样便于客户端验证自动执行。
然后,当页面被回送时,ASP.NET将触发CustomValidator验证控件的OnServerValidate事件。可以通过OnServerValidate事件提供服务器端验证处理程序。与客户端验证子程序相似,可以通过将ServerValidateEventArgs对象的Value属性作为参数传递到事件处理程序,可以访问来自要验证的输入控件的字符串。验证结果随后将存储在ServerValidateEventArgs对象的IsValid属性中。示例如下面的代码所示。
protected void ServerValidation(object source, ServerValidateEventArgs arguments)
{
try
{
int i=int.Parse(arguments.Value);
arguments.IsValid=((i%2)==0);
}
catch
{
arguments.IsValid=false;
}
}
到现在为止,上面已经创建好了一个检查输入的数字是否是2的倍数的客户端验证子程序和服务器端验证子程序。接下来,需要创建一个测试页面对它们进行一个简单的测试,如代码清单4-6所示。
代码清单4-6 TestCustomValidator.aspx
<form id="Form1"runat="server">
<asp:TextBox ID="TextBox1"Text="请输入一个数字"runat="server"/>
<br/>
<asp:CustomValidator
ID="CustomValidator1"
ControlToValidate="TextBox1"
ClientValidationFunction="ClientValidate"
nServerValidate="ServerValidation"
Text="你输入的数字不是2的倍数"
ForeColor="green"runat="server"/>
<p/>
<asp:Button ID="Button1"Text="提交数据"runat="server"/>
</form>
在代码清单4-6中,分别设置属性Cli ent ValidationFunction="ClientValidate"和OnServer Validate="ServerValidation"来将客户端验证子程序ClientValidate和服务器端验证子程序Server-Validation关联到验证控件CustomValidator1,运行结果如图4-9所示。
图 4-9 TestCustomValidator.aspx运行结果
另外,CustomValidator验证控件还有一个特殊的属性ValidateEmptyText,它的默认值为false。然而,你很可能创建一个试图可以访问空值的客户端脚本,这时,你便需要将ValidateEmptyText设置为true来为服务器端处理程序实现同样的行为。
注意在创建客户端验证函数时,请确保包括服务器端验证函数的功能。如果创建客户端验证函数时不存在相应的服务器端函数,则恶意代码可能会绕过验证。