首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 伺服器控制項:自訂驗證控制項開發指南

     編輯:關於ASP.NET

為什麼需要自訂驗證控制項?

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 事件)雙軌並行。

開發自訂驗證控制項步驟

  1. 繼承 BaseValidator: public class MyValidator : BaseValidator
  2. 覆寫 EvaluateIsValid(): 實作核心驗證邏輯,回傳 true/false。
  3. (選擇性)實作用戶端驗證: 覆寫 AddAttributesToRender 註冊 ClientValidationFunction,並編寫對應 JavaScript 函式。
  4. (選擇性)加入設計時支援: 套用 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;
}

部署與使用

  1. 將控制項編譯為組件(.dll),置於網站 Bin 目錄或 GAC。
  2. 在頁面或 web.config 註冊標籤前綴:<%@ Register Assembly="MyValidators" Namespace="MyValidators" TagPrefix="cc" %>
  3. 頁面中直接使用:<cc:DateRangeValidator ID="valDateRange" runat="server" StartDateControlID="txtStart" EndDateControlID="txtEnd" ErrorMessage="結束日期必須大於開始日期" />

最佳實務建議

  • 單一職責:每個自訂驗證器只處理一項業務規則,方便重複使用與單元測試。
  • 優先用戶端驗證:減少回傳次數,提升使用者體驗;伺服器端務必再驗證一次防止繞過。
  • 善用 ValidationGroup:支援頁面多區塊獨立驗證(如登入區、註冊區)。
  • 錯誤訊息本地化:透過資源檔管理多語系訊息。

結語

掌握 ASP.NET 2.0 驗證框架擴充機制,即可將複雜業務驗證封裝為可重複使用的伺服器控制項,同時兼顧用戶端即時回饋與伺服器端安全防護,大幅提升開發效率與程式碼品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved