建立具有自驗證功能的textbox控制項

來源:互聯網
上載者:User
建立|控制項

    導言
   
    在強大的.NET面前,我有很多的想法,我希望asp.net的web控制項內建有驗證功能,而不需要在頁面中插入太多的驗證控制項以致代碼混亂!現在我們將可以利用.NET來建立一個只允許輸入整型數位的textbox控制項或只允許輸入貨幣型資料的textbox控制項,等等。當然了,你還可以特別指定textbox控制項可否為空白或者是否在一個範圍內,等等,另外,當我們輸入的資料符合要求時,還可以返回一個值,以方便我們覺得是否要幹預,甚至我們可以讓它啟動並執行時候根據輸入資料是否符合要求呈現不同的顏色
   
    經過一番努力,我終於實現以上的想法
   
    實現IValidator介面
   
    我在鑽研SDK文檔時發現,只要實現了IValidator介面,任何的控制項都可以具有驗證功能,以下是一個繼承textbox控制項的簡單的例子:
using System;
using System.Web.UI.WebControls;
using System.Web.UI;

namespace MyValidatingControls {
   public class TextBox : System.Web.UI.WebControls.TextBox, IValidator {
      private bool _valid = true;
      private string _errorMessage = "";

      public bool IsValid {
         get { return _valid; }
         set { _valid = value; }
      }

      public string ErrorMessage {
         get { return _errorMessage; }
         set { _errorMessage = value; }
      }

      public void Validate() {
      }
   }
}
    當然了,這段程式什麼都不做,但是它完全實現了基本的IValidator介面的架構(至少它是可以成功編譯的),我使用Private關鍵字建立兩個欄位(field)用來儲存驗證狀態和錯誤資訊,為了確保驗證控制項能被執行,我們必須把我們的驗證控制項添加到頁面中的驗證控制項集合中來。
   
    我在閱讀SDK文檔的時候發現,驗證控制項是在初始化期間載入他們本身的,IValidators介面主要用來註冊他們自己,所以我們需要使用覆蓋的方法重新實現OnInit和OnUnload事件,以便我們能從頁面中的驗證控制項集合中添加或者刪除它們
protected override void OnInit(EventArgs e) {
   base.OnInit(e);
   Page.Validators.Add(this);
}

protected override void OnUnload(EventArgs e) {
   if (Page != null) {
      Page.Validators.Remove(this);
   }
   base.OnUnload(e);
}

    完成設定

    在我們實現我們的驗證功能之前,為了使事件更簡潔,我設定了一些協助項目,因為我不想單獨分別單獨提供驗證控制項的錯誤資訊,而是希望把他們嵌入到控制項中來,以實現我們所期望格式的資料錄入,因此,我需要做一些事情,使它可以適當的出現錯誤提示。
   
    我將添加一個叫做FriendlyName屬性,它將在所有的錯誤提示資訊中出現以提示使用者合法的資料類型,所以,如果我們調用的控制項ID是RetailPrice,我們將使該控制項的riendlyName為Retail Price
private string _friendlyName = "";

public string FriendlyName {
   get { return _friendlyName; }
   set { _friendlyName = value; }
}

    最後,我們重寫IsValid事件,使它可以在驗證不通過時可以改變控制項的背景顏色
public bool IsValid {
   get { return _valid; }
   set {
      _valid = value;
      if (!_valid) {
         this.BackColor = Color.LightCoral;
      }
      else {
         this.BackColor = Color.White;
      }
   }
}

    不允許出現空格

    首先我們需要確定,提供一個可選項以決定是否允許為空白值,我們在這裡需要建立一個屬性以判斷是否可以為空白
   
private bool _blankAllowed = true;

public bool AllowBlank {
    get { return _blankAllowed; }
    set { _blankAllowed = value; }
}

    最後,我們可以重寫驗證函式
   
public virtual void Validate() {
   this.IsValid = true;

   if (!this.AllowBlank) {
      bool isBlank = (this.Text.Trim() == "");

      if (isBlank) {
         this.ErrorMessage =
             String.Format("'{0}' cannot be blank.",
             this.FriendlyName);
         this.IsValid = false;
      }
   }
}

    拓展我們的創意

    現在我們已經建立了一個內建基本驗證功能的textbox控制項,現在我們可以延展我們的想法,建立更多的有趣的具有特定驗證功能的textbox控制項
   
    下面以建立一個只允許輸入整型資料的textbox控制項(IntegerTextBox),並且使該控制項具有只允許輸入的資料必須在一定的範圍內,但我們仍然需要考慮是否允許空值,所以,象上面一樣,需要添加一個屬性
   
    在上面我們建立的基本的textbox控制項的基礎上,我們僅僅需要繼承該控制項,然後覆蓋Validate函數和添加一些新的屬性
   
private int _minValue = Int32.MinValue;
private int _maxValue = Int32.MaxValue;

public int MinValue {
   get { return _minValue; }
   set {
      _minValue = value;

      if (_minValue > _maxValue) {
          int swap = _minValue;
          _minValue = _maxValue;
          _maxValue = swap;
      }
   }
}

public int MaxValue {
   get { return _maxValue; }
   set {
      _maxValue = value;

      if (_minValue > _maxValue) {
          int swap = _minValue;
          _minValue = _maxValue;
          _maxValue = swap;
      }
   }
}

    然後,我們擴充該Validate函數,並把編譯它為本地代碼
   
public override void Validate() {
   this.IsValid = true;

   bool isBlank = (this.Text.Trim() == "");

   if (isBlank) {
      if (!AllowBlank) {
         this.ErrorMessage = String.Format("'{0}' " +
            "cannot be blank.", this.FriendlyName);
         this.IsValid = false;
      }
   } else {
      try {
         _value = Int32.Parse(this.Text);
         if (_value < this.MinValue) {
            this.ErrorMessage = String.Format("'{0}' cannot " +
              "be less than {1}",
              this.FriendlyName, this.MinValue);
            this.IsValid = false;
         }

         if (_value > this.MaxValue) {
            this.ErrorMessage = String.Format("'{0}' " +
               "cannot be more than {1}",
               this.FriendlyName, this.MinValue);
            this.IsValid = false;
         }
      } catch {
         this.ErrorMessage = String.Format("'{0}' " +
              "is not a valid integer.", this.FriendlyName);
         this.IsValid = false;
      }
   }
}

public int Value {
   get { return _value; }
   set {
      _value = value;
      this.Text = _value.ToString();
   }
}

    結論
   
    要寫就那麼多了,現在我們還可以在這個類的基礎上建立諸如要求只能輸入符合一定時間格式和貨幣格式,下面我們舉一個例子以說明如何使用我們建立的控制項
   
    在此以前我們要實現同樣的功能需要寫以下的代碼:
   
<asp:TextBox id="Number" runat="server"/>
<asp:RequiredFieldValidator id="RequiredFieldValidator2"
   ControlToValidate="Number"
   Text="'Number' cannot be blank." runat="server"/>
<asp:RangeValidator id="Range1" ControlToValidate="Number"
   MinimumValue="0" MaximumValue="100"
   Type="Integer" Text="The value must be from 0 to 100!"
   runat="server"/>
  
    而現在,我們僅僅需一句:
MyControls:IntegerText id="Number"
    FriendlyName="Number" MinValue="0" MaxValue="100"
    AllowBlank="false" runat="server">
   
    最後,需要說明的是,我建立的這個類相對與現有的驗證來說並不那麼完美,一個明顯需要改進地方是,我們需要在該類中添加用戶端指令碼,以使驗證行為可以不只在伺服器端觸發,也可以在用戶端觸發
  
    我希望每一個人都能理解它的運行原理,以便你有更好的創意的時候可以修正它,也許有一天我可能會使用你建立的具有完美功能的類集。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。