Silverlight輸入數據驗證系列二

Silverlight實例教程 - Validation數據驗證DataAnnotation機制和調試技巧

時間:2010-09-09 21:18來源:SilverlightChina.Net 作者:Jv9 點擊: 390次
在學習了Silverlight Validation數據驗證基礎屬性和事件後,大家對Silverlight數據驗證應該有了一個簡單明瞭的認識。今天,我將繼續介紹另外一種Silverlight的Validation驗證機制,DataAnnotation。
  

 

 

在學習了Silverlight Validation數據驗證基礎屬性和事件後,大家對Silverlight數據驗證應該有了一個簡單明瞭的認識。今天,我將繼續介紹另外一種Silverlight的Validation驗證機制,DataAnnotation。

 

在文章開始前,我想首先介紹一下Visual Studio中如何調試Silverlight的Validation代碼。

 

Visual Studio 2010調試Silverlight Validation設置技巧

 

相信大家在運行上一篇的代碼時會發現,在異常出現時,Visual Studio會自動中斷和獲取當前異常錯誤信息,這爲調試帶來了一些不便。

 

針對以上問題,我們可以在Visual Studio中進行簡單設置,暫時取消在Debug模式下對異常的捕獲,方法如下:

首先到Debug菜單,選擇Exceptions菜單,也可以使用“Ctrl+Alt+E”,激活Exception窗口

 

點擊“Find”查找以下選項,

System.Exception,將其後面的CheckBox取消選中,

這樣就實現了當數據驗證時,Visual Studio不再捕獲異常錯誤。

 

對於本篇,我們將使用DataAnnotation驗證機制,該驗證機制與上一篇略有不同,所以,如果要實現Visual Studio忽略捕獲異常,要另外在Exception窗口搜索“System.ComponentModel.DataAnnotations.ValidationException",同樣將其後面的CheckBox取消選中。

Visual Studio 2008和Silverlight 3開發環境中,默認情況下Exception沒有System.ComponentModel.DataAnnotations.ValidationException選項,開發人員可以自行添加一個新的異常即可,點擊“Add”按鈕,

 

在完成以上的操作後,再次執行Silverlight應用調試Validation時,Visual Studio不再出現異常捕獲,相對方便很多。

 

Silverlight DataAnnotation驗證機制

 

驗證Metadata屬性

Silverlight的DataAnnotation驗證機制是Silverlight 3發佈WCF RIA Services測試版是推出的客戶端驗證機制,對於DataAnnotation的翻譯,可以理解爲“數據元素註釋”驗證法。該驗證機制,使用了System.ComponentModel.DataAnnotations命名空間中的屬性類,通過對DataMember數據成員設置Metadata元數據屬性,對其驗證值進行判斷是否符合當前屬性條件,以達到Validation的效果。該驗證機制,多數運用於WCF RIA Services應用中.

 

 1         private string _email;
 2         [Required(ErrorMessage = "必填選項")]
 3         public string email
 4         {
 5             get { return _email; }
 6             set 
 7             {
 8                 _email = value; 
 9             }
10         }

 

 

從上面代碼可以看到屬性上面的註釋 [Required(ErrorMessage = "必填選項")],該註釋就是DataAnnotations類中的固有屬性,其結果是判斷該控件內容是否爲空,如果是,則彈出異常。目前常用的DataAnnotation屬性如下列表:

屬性名稱

描述

Required

標識該屬性爲必需參數,不能爲空

StringLength

標識該字符串有長度限制,可以限制最小或最大長度

Range

標識該屬性值範圍,通常被用在數值型和日期型

RegularExpression

標識該屬性將根據提供的正則表達式進行對比驗證

CustomValidation

標識該屬性將按照用戶提供的自定義驗證方法,進行數值驗證

 

在隨後的實例中,我們將一一演示這些屬性的使用方法。

 

ValidationContext和Validator類

閱讀過上一篇Silverlight Validation基礎的朋友應該知道,Silverlight的數據驗證,可以在數據成員的Setter中設置條件驗證,根據其驗證結果判斷是否符合驗證。例如:

 

 1         private int _age;
 2         public int Age
 3         {
 4             get { return _age; }
 5             set
 6             {
 7                 if (value > 100 || value < 0)
 8                 {
 9                     throw new Exception("請輸入年齡值在0 - 100之間.");
10                 }
11                 _age = value;
12             }
13         }

 

 

在set中,判斷年齡值是否超過100歲或者低於0歲,如果不符合條件,則拋出異常,該異常將被Validation機制捕獲,並顯示到UI。

 

而Silverlight的DataAnnotation機制,與上面驗證方法不同。Silverlight的DataAnnotation驗證機制,在添加驗證屬性後,不需要在Setter中進行驗證判斷,僅需要在Setter中激活該驗證屬性即可,而要實現激活驗證,則需要使用ValidationContext和Validator類。爲了更好的理解Silverlight DataAnnotation驗證機制,我們來對這兩個類進行簡單的講解,

 

首先說說Validator類,該類是一個靜態類,主要用來當數據成員被指定驗證元數據屬性時,驗證對象,屬性和方法。簡單的理解就是包含了各種具體驗證方法的類。例如上文代碼,我們使用了Require驗證屬性,Validator類將會根據該驗證屬性執行對應的驗證方法,對目標值進行判斷。在該類中,包含ValidateProperty方法和TryValidateProperty方法,可以分別對當前屬性進行驗證操作。

 

ValiationContext類,該類是對當前執行的數據驗證提供上下文描述的。簡單的理解,也就是爲驗證提供數據傳輸,屬性標識等任務。

 

我們對email屬性,進行簡單的修改,添加以上兩個類,讓該屬性Silverlight的DataAnnotation機制生效。

 

 1         private string _email;
 2         [Required(ErrorMessage = "必填選項")]
 3         public string email
 4         {
 5             get { return _email; }
 6             set 
 7             {
 8                 var tmpValidator = new ValidationContext(thisnullnull);
 9                 tmpValidator.MemberName = "email";
10                 Validator.ValidateProperty(value, tmpValidator);
11                 _email = value; 
12             }
13         }

 

 

在上文代碼中,我們定義一個ValidationContext實例,該實例中包含了需要驗證對象的引用,並且,我們定義了驗證對象的MemberName,通過調用Validator.ValidateProperty靜態方法,檢查目標數據是否符合當前驗證屬性,如果返回False,則拋出一個ValidationException。

上面代碼也可簡寫爲:

 

1 Validator.ValidateProperty(value, new ValidationContext(thisnullnull) { MemberName = "email" });

 

 

當運行實例後,輸入空格在郵件文本框中,Silverlight的DataAnnotation驗證機制將被激活,生成如下效果:

 

在理解了上面的Silverlight的DataAnnotation驗證機制的基本類和屬性後,我們可以做幾個簡單的實例,來加深理解。

 

1. StringLength,定義Password密碼框最大可輸入6個字符,

 

1             <StackPanel Orientation="Horizontal" Margin="5">
2                 <TextBlock Text="密   碼: " VerticalAlignment="Center"/>
3                 <TextBox x:Name="txtPassword" Width="200" DataContext="{Binding Source={StaticResource UserDataContext}}" Text="{Binding Path=password, Mode=TwoWay,ValidatesOnExceptions=True, NotifyOnValidationError=True}" />
4             </StackPanel>

 

 

 

 1         private string _password;
 2         [StringLength(6, ErrorMessage="密碼不能超過6個字符")]
 3         public string password
 4         {
 5             get { return _password; }
 6             set 
 7             {
 8                 Validator.ValidateProperty(value, new ValidationContext(thisnullnull) { MemberName = "password" });
 9                 _password = value; 
10             }
11         }

 

 

 

2. Range,我們使用Range屬性設置Age年齡的有效範圍,

 

 

1 <StackPanel Orientation="Horizontal" Margin="5">
2                 <TextBlock Text="年   齡: " VerticalAlignment="Center"/>
3                 <TextBox x:Name="txtAge" Width="200" DataContext="{Binding Source={StaticResource UserDataContext}}" Text="{Binding Path=Age, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}" />
4             </StackPanel>

 

 

 

 1         private int _age;
 2         [Range(0100, ErrorMessage = "請輸入年齡值在0 - 100之間")]
 3         public int Age
 4         {
 5             get { return _age; }
 6             set
 7             {
 8                 Validator.ValidateProperty(value, new ValidationContext(thisnullnull) { MemberName = "Age" });
 9                 _age = value;
10             }
11         }

 

 

 

 

3. RegularExpression,我們使用正則表達式屬性,驗證郵件輸入框。

 

1 <StackPanel Orientation="Horizontal" Margin="5">
2                 <TextBlock Text="郵   件: " VerticalAlignment="Center"/>
3                 <TextBox x:Name="txtEmail" Width="200" DataContext="{Binding Source={StaticResource UserDataContext}}" Text="{Binding Path=email, Mode=TwoWay, ValidatesOnNotifyDataErrors=False, NotifyOnValidationError=True, ValidatesOnExceptions=True}" />
4             </StackPanel>

 

 

 1         private string _email;
 2         [Required(ErrorMessage = "必填選項")]
 3         [RegularExpression(@"^([0-9a-zA-Z]([-./w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-/w]*[0-9a-zA-Z]/.)+[a-zA-Z]{2,9})$",ErrorMessage="請輸入正確的Email格式")]
 4         public string email
 5         {
 6             get { return _email; }
 7             set 
 8             {
 9                 var tmpValidator = new ValidationContext(thisnullnull);
10                 tmpValidator.MemberName = "email";
11                 Validator.ValidateProperty(value, tmpValidator);
12                 _email = value; 
13             }
14         }

 

 

4. 自定義驗證方法的應用

我們創建一個簡單的自定義驗證方法,驗證用戶名是否爲jv9.

首先創建自定義驗證類,CustomizeValidation,在類中添加引用,using System.ComponentModel.DataAnnotations;

然後繼承ValidationAttribute類,使其預定義該類爲自定義驗證屬性,

完成上面的設置後,即可創建自定義驗證方法。

 

 

1     public class CustomizeValidation : ValidationAttribute
2     {
3         protected override ValidationResult IsValid(object value, ValidationContext validationContext)
4         {
5             String checkName = value.ToString();
6 
7             return checkName == "jv9" ? ValidationResult.Success : new ValidationResult("請使用指定用戶名");
8         }
9     }

 

 

在Name屬性中,進行調用,

 

 1         private string _name;
 2         [CustomizeValidation]
 3         public string Name
 4         {
 5             get { return _name; }
 6             set 
 7             {
 8                 Validator.ValidateProperty(value, new ValidationContext(thisnullnull) { MemberName = "Name" });
 9                 if (string.IsNullOrEmpty(value))
10                 {
11                     throw new Exception("用戶名不能爲空.");
12                 }
13                 _name = value; 
14             }
15         }

 

 

 

 

對於Silverlight的DataAnnotation驗證機制,相比其他驗證機制使用起來較爲簡單,但是其本身具有一定侷限性。特別是當數據成員來自服務器端,會因爲類庫無法共享使用造成無法正常驗證。前文曾提及,該驗證機制多數用在WCF RIA Services,因爲WCF RIA應用提供的數據層,可生成對應客戶端代碼,即可實現在客戶端的DataAnnotation驗證。在隨後的實例中,我將演示一套WCF RIA服務下的驗證實例。

 

今天講到這裏,希望大家能夠有所收穫。

 

源代碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章