ASP.NET 2.0 內建五大驗證控制項(RequiredFieldValidator、CompareValidator、RangeValidator、RegularExpressionValidator、CustomValidator)已能滿足大多數輸入檢查需求。但當業務規則涉及跨欄位邏輯、資料庫查詢驗證、或複雜條件判斷時,內建控制項難以勝任。此時擴充驗證框架、開發自訂驗證控制項便是最佳解方。
| 控制項 | 用途 | 關鍵屬性 |
|---|---|---|
| RequiredFieldValidator | 必填檢查 | ControlToValidate, ErrorMessage |
| CompareValidator | 比較運算子(<, =, >)與常值或另一控制項比較 | ControlToValidate, ControlToCompare, ValueToCompare, Operator, Type |
| RangeValidator | 範圍檢查(數字、字串、日期) | ControlToValidate, MinimumValue, MaximumValue, Type |
| RegularExpressionValidator | 正則表達式模式比對 | ControlToValidate, ValidationExpression |
| CustomValidator | 自訂伺服器/用戶端驗證邏輯 | ControlToValidate, OnServerValidate, ClientValidationFunction |
另有一 ValidationSummary 控制項,彙總頁面所有驗證錯誤訊息,統一顯示於指定位置或訊息方塊。
BaseValidator,提供共同屬性與方法(Validate()、IsValid、ErrorMessage 等)。Page.Validate() → 逐一呼叫各驗證控制項 Validate() → 設定 IsValid → 若失敗則渲染錯誤訊息。ClientValidationFunction)與伺服器端驗證(ServerValidate 事件)雙軌並行。public class MyValidator : BaseValidatortrue/false。AddAttributesToRender 註冊 ClientValidationFunction,並編寫對應 JavaScript 函式。ToolboxData、DefaultProperty 等屬性,優化 Visual Studio 體驗。[ToolboxData("<{0}:DateRangeValidator runat=server></{0}:DateRangeValidator>")]
public class DateRangeValidator : BaseValidator
{
[Category("Behavior"), Description("開始日期控制項 ID")]
public string StartDateControlID { get; set; }
[Category("Behavior"), Description("結束日期控制項 ID")]
public string EndDateControlID { get; set; }
protected override bool EvaluateIsValid()
{
Control startCtrl = FindControl(StartDateControlID);
Control endCtrl = FindControl(EndDateControlID);
if (startCtrl == null || endCtrl == null) return true;
DateTime startDate, endDate;
if (DateTime.TryParse(GetControlValidationValue(startCtrl), out startDate) &&
DateTime.TryParse(GetControlValidationValue(endCtrl), out endDate))
{
return endDate > startDate;
}
return true; // 格式錯誤交由其他驗證器處理
}
// 用戶端驗證函式註冊
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
if (RenderUplevel)
{
Page.ClientScript.RegisterExpandoAttribute(ClientID, "evaluationfunction", "DateRangeValidatorEvaluateIsValid");
Page.ClientScript.RegisterExpandoAttribute(ClientID, "startdatecontrolid", StartDateControlID);
Page.ClientScript.RegisterExpandoAttribute(ClientID, "enddatecontrolid", EndDateControlID);
}
}
}
對應 JavaScript:
function DateRangeValidatorEvaluateIsValid(val) {
var startCtrl = document.getElementById(val.startdatecontrolid);
var endCtrl = document.getElementById(val.enddatecontrolid);
if (!startCtrl || !endCtrl) return true;
var start = new Date(startCtrl.value);
var end = new Date(endCtrl.value);
return !isNaN(start) && !isNaN(end) && end > start;
}
Bin 目錄或 GAC。web.config 註冊標籤前綴:<%@ Register Assembly="MyValidators" Namespace="MyValidators" TagPrefix="cc" %><cc:DateRangeValidator ID="valDateRange" runat="server" StartDateControlID="txtStart" EndDateControlID="txtEnd" ErrorMessage="結束日期必須大於開始日期" />ValidationGroup:支援頁面多區塊獨立驗證(如登入區、註冊區)。掌握 ASP.NET 2.0 驗證框架擴充機制,即可將複雜業務驗證封裝為可重複使用的伺服器控制項,同時兼顧用戶端即時回饋與伺服器端安全防護,大幅提升開發效率與程式碼品質。