[C#] 使用Enterprise Library Validation Block對表單進行驗證 (1)

  • 4860
  • 0

[C#] 使用Enterprise Library Validation Block對表單進行驗證 (1)


前言

在使用者輸入資料的時候,我們通常對會對使用者所輸入的資料進行驗證的動作,

除了可以避免隱性的Sql Injection、XSS攻擊之外,也可以確保資料格式的正確性,

在Asp.Net中,我們通常會使用Validate Control,或是JQuery Validate

而在Asp.Net MVC 2中也新增了十分強大的Model Validation功能,

但若我們在Web Service或是Winform想要對表單進行驗證的時候,

就沒有上述那些好用的工具,為了確保資料的正確,

因此我們必須藉助微軟的Enterprise Library Validation Block,

來實現對輸入欄位驗證的功能。

 

實際演練

在開始操作之前,你必須確認是否已安裝了Microsoft Enterprise Library (此範例的版本為4.1)

首先,我們先建立一個簡單的Person Class,並定義我們所需要的Property如下

 


 public class Person
    {
		#region Fields (5) 

        private string _Email;
        private string _Id;
        private string _Introduce;
        private string _Name;
        private string _Phone;

		#endregion Fields 

		#region Properties (5) 
        
        public string Email
        {
            get { return _Email; }
            set { _Email = value; }
        }
        
        public string Id
        {
            get { return _Id; }
            set { _Id = value; }
        }
        
        public string Introduce
        {
            get { return _Introduce; }
            set { _Introduce = value; }
        }
        
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        
        public string Phone
        {
            get { return _Phone; }
            set { _Phone = value; }
        }

		#endregion Properties 
    }

然後我們可以建立一個輸入的表單如下

11

再來,我們就要對我們的Model建立驗證的條件了,

建立的方法很簡單,我們只需要再要增加驗證條件的Property加上Attribute就好了,如下


[StringLengthValidator(5,100)]
        [RegexValidator(@"([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})")]
        public string Email
        {
            get { return _Email; }
            set { _Email = value; }
        }

        [RegexValidator(@"^[A-Za-z]{1}\d{9}$")]
        public string Id
        {
            get { return _Id; }
            set { _Id = value; }
        }

        [StringLengthValidator(1, 200)]
        public string Introduce
        {
            get { return _Introduce; }
            set { _Introduce = value; }
        }

        [StringLengthValidator(1,30)]
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        [RegexValidator(@"^\d{2,4}-\d{6,8}$")]
        public string Phone
        {
            get { return _Phone; }
            set { _Phone = value; }
        }

在此處我所使用的兩種Attribute分別為StringLengthValidator和RegexValidator,

功能分別為檢查字串長度是否在範圍之內,以及字串是否符合對應的Regular Expression,

然後我們只要也在MainForm的Button Click加上檢查,如下


private void Button_Submit_Click(object sender, EventArgs e)
        {
            Person person = new Person()
            {
                Name = Textbox_Name.Text,
                Id = Textbox_Id.Text,
                Phone = Texbox_Phone.Text,
                Email = Textbox_Email.Text,
                Introduce = Textbox_Introduce.Text
            };

            //使用Enterprise Library驗證Person格式是否正確
            var validateResults = Validation.Validate<Person>(person);

            //若錯誤跳出錯誤訊息,顯示錯誤欄位
            if (!validateResults.IsValid)
            {
                StringBuilder builder = new StringBuilder();
                builder.AppendLine("Person's is not valid:");

                foreach (var result in validateResults)
                {
                    builder.AppendLine(
                        string.Format(                            
                            "{0}: {1}",
                            result.Key,
                            result.Message));
                }

                MessageBox.Show(
                    this,
                    builder.ToString(),
                    "Format Error",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return;
            }

            //格式正確,新增成功
            MessageBox.Show("Insert Success!!");
        }

如此一來,只要我們在所輸入的格式資料不正確時,按下送出,

就會跳出錯誤訊息,確保欄位資料的正確性!

12 

Validation Block 包含的 Validators

 

結語

使用Enterprise Library進行資料驗證,也符合了SoC(關注點分離)的精神,

可以讓Model的驗證邏輯保持在Model之中,

若需要變更,只需要修改相對應的Model屬性即可,

在接下來的文章之中,還將會提到如何自訂錯誤訊息,

以及使用Config檔來配置Validation的邏輯,

如果有任何問題,請大家多多指教囉 :)

 

參考資料:

Enterprise Library - Validation Application Block 學習手冊

Introduction to the Validation Application Block

範例下載:下載