如果我们所要处理的数据有上列数据验证web 控件无法执行的特殊表达式,可以利用customvalidator web 控件可以让我们自定数据的检验方式。其使用语法为:
<asp:customvalidator
id="被程序代码所控制的名称"
runat="server"
controltovalidate="要验证的控件名称"
onservervalidate="自订的验证程序"
errormessage="所要显示的错误信息"
text="未通过验证时所显示的讯息"
/>
其常用属性说明如下表所示:

customvalidator web 控件在执行自订的验证时,是呼叫onservervalidate 属性所指定的程序来执行验证;当被呼叫的程序传回true 时则表示验证成功,传回false 则表示验证失败。其方法的宣告语法如下所示:
function 程序名称(sender as object, value as string)as boolean
'验证成功
return true
'验证失败
return false
end function
由于这个事件程序要明确的宣告传回值的数据型态,所以这里我们要在这个事件程序以function来宣告,并且要指明传回值的型态为boolean。另外程序内所接收的第二个参数value 表示使用者输入的资料,我们可以将这个参数作验证后,再传回代表验证成功的true 或验证失败的false。下列范例限制使用者必须输入十的倍数才可以通过验证:
<html>
<form id="form1" runat="server">
请输入10 的倍数: <asp:textbox id="txtvalue" runat="server"/>
<asp:button id="btnok" text="确定" onclick="btnok_click"
runat="server"/><br>
<asp:customvalidator id="validor1" runat="server"
controltovalidate="txtvalue"
onservervalidate="custvali"
text="必需输入十的倍数!"/><br>
<asp:label id="lblmsg" runat="server"/>
</form>
<script language="vb" runat="server">
function custvali(sender as object, value as string)as boolean
if value.toint16 mod 10=0 then
return true
else
return false
end if
end function
sub btnok_click(sender as object,e as eventargs)
if page.isvalid then
lblmsg.text="验证成功!"
else
lblmsg.text="验证失败!"
end if
end sub
</script>
</html>

下列的范例为验证使用者的身分证号码。身分的验证在网页的应用上蛮常见的,首先我们先来了解验证的公式。身分证号码有十位数,我们将这十个位数进行编号,从第一位数f1 编到第十位数f10;如下所示:

其中英文字母有特定的编号,如下表所示:

身分证验证的公式为:
总和=(f10 的个位数+(f10 的十位数
×9)+(f9×8)+(f8×7)+( f7×6)+( f6×5)+( f5×4)+( f4×3)+( f3×2)+( f2
+f1))
如果总和除以10 可以被整除,那么表示使用者所输入的身分证号码是正确的。其验证的程序代码如下所示:
<html>
<form id="form1" runat="server">
请输入身分证号码: <asp:textbox id="txtvalue" runat="server"/>
<asp:button id="btnok" text="确定" onclick="btnok_click"
runat="server"/><br>
<asp:customvalidator id="validor1" runat="server"
controltovalidate="txtvalue"
onservervalidate="custvali"/><br>
<asp:label id="lblmsg" runat="server"/>
</form>
<script language="vb" runat="server">
function custvali(sender as object, value as string)as boolean
if len(value)<>10 then '如果位数小于10
validor1.text="请输入十位数!"
return false
else if char.isletter(left(value,1))=false then '检查第一个字符是
不是英文字母
validor1.text="必须以英文字母开头!"
return false
end if
dim shti, shtj, shtk as short
for shti=2 to 10 '检查第二位至第十位是否为数值
if isnumeric(mid(value, shti, 1))=false then
validor1.text="第二位至第九位必须是数值!"
return false
end if
next
'以下依序宣告26 个英文字母所代表的编号
dim arf1() as short = {10,11,12,13,14,15,16,17,34,18,19,20,21, _
22,35,23,24,25,26,27,28,29,30,41,42,33}
shti=arf1(asc(ucase(left(value,1)))-65) '取得使用者输入英文字母
的编号
for shtj=2 to 8 '计算加总
shtk+=mid(value, shtj, 1).toint16 * (10-shtj)
next
shtk+=mid(value, 9, 1).toint16 + mid(value, 10, 1).toint16 + _
left(shti.tostring, 1).toint16 + (left(shti.tostring,
2).toint16 * 9)
if shtk mod 10 <> 0 then '如果算式加总不能被10 整除
validor1.text="您所输入的身分证号码不正确!"
return false
else
return true '验证成功, 传回true
end if
end function
sub btnok_click(sender as object,e as eventargs)
if page.isvalid then
lblmsg.text="验证成功!"
else
lblmsg.text="验证失败!"
end if
end sub
</script>
</html>

如果只输入三位数。

如果只输入十位数值。

如果随便输入身分证号码。

如果输入a123456789 正确的身分证号码。