如果我们所要处理的数据有上列数据验证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>