如果我們所要處理的數據有上列數據驗證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>