六大內建驗證控件
| 控件 | 用途 | 關鍵屬性 |
| RequiredFieldValidator | 必填欄位 | ControlToValidate, InitialValue |
| CompareValidator | 比較兩控件值或與固定值比較 | ControlToCompare, ValueToCompare, Operator, Type |
| RangeValidator | 數值/日期範圍 | MinimumValue, MaximumValue, Type |
| RegularExpressionValidator | 正則表達式格式驗證 | ValidationExpression |
| CustomValidator | 自訂邏輯(客戶端 JS + 伺服端 C#) | ClientValidationFunction, OnServerValidate |
| ValidationSummary | 彙總顯示所有錯誤訊息 | ShowMessageBox, ShowSummary, HeaderText |
共同基類 BaseValidator 核心屬性
ControlToValidate:指定被驗證控件 ID。
ErrorMessage / Text:驗證失敗顯示文字。
Display:None/Static/Dynamic 控制錯誤訊息佔位方式。
EnableClientScript:是否產生客戶端腳本(預設 true)。
ValidationGroup:分組驗證,配合按鈕 ValidationGroup 實現單頁多表單獨立驗證。
SetFocusOnError:失敗時自動焦點到該控件。
驗證策略:客戶端 vs 伺服端
- 客戶端驗證:即時回饋、減少回傳、提升體驗。適用:長度、格式、必填、邏輯簡單運算。不可信任,使用者可停用 JS 或偽造請求。
- 伺服端驗證:最終防線,業務規則、資料庫唯一性、權限檢查、資安相關。必須實作。
- 混合模式:預設行為,
Page.IsValid 綜合判斷雙端結果。
CustomValidator 雙端實作範例:驗證輸入為偶數
客戶端 JavaScript
function ValidateEven(source, args) {
var val = parseInt(args.Value, 10);
args.IsValid = !isNaN(val) && (val % 2 === 0);
}
伺服端 C#
protected void cvEven_ServerValidate(object source, ServerValidateEventArgs args)
{
int val;
args.IsValid = int.TryParse(args.Value, out val) && (val % 2 == 0);
}
標記
<asp:TextBox ID="txtNumber" runat="server" />
<asp:CustomValidator ID="cvEven" runat="server"
ControlToValidate="txtNumber"
ErrorMessage="必須為偶數"
ClientValidationFunction="ValidateEven"
OnServerValidate="cvEven_ServerValidate"
Display="Dynamic" />
<asp:Button ID="btnSubmit" runat="server" Text="送出" ValidationGroup="vg1" />
<asp:ValidationSummary ID="vs1" runat="server" ValidationGroup="vg1" HeaderText="錯誤清單:" />
進階技巧
- 驗證群組:單頁多表單(如登入/註冊並存)時,給各區塊控件與按鈕相同
ValidationGroup。
- 手動觸發:
Page.Validate("vg1"); if (Page.IsValid) ...。
- 動態控件驗證:
Page.LoadComplete 階段動態加入驗證控件並 Page.Form.Controls.Add。
- 取消驗證:按鈕
CausesValidation="false"(如「取消」、「重設」按鈕)。
常見誤區
- 以為客戶端驗證通過就安全 → 錯,伺服端必須再驗證一次。
RegularExpressionValidator 正則未加 ^...$ 導致部分匹配誤判。
- 忘記設定
ValidationGroup 導致無關按鈕觸發全頁驗證。