在學習了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應用中.
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中設置條件驗證,根據其驗證結果判斷是否符合驗證。例如:
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機制生效。
2 [Required(ErrorMessage = " 必填選項 " )]
3 public string email
4 {
5 get { return _email; }
6 set
7 {
8 var tmpValidator = new ValidationContext( this , null , null );
9 tmpValidator.MemberName = " email " ;
10 Validator.ValidateProperty(value, tmpValidator);
11 _email = value;
12 }
13 }
在上文代碼中,我們定義一個ValidationContext實例,該實例中包含了需要驗證對象的引用,並且,我們定義了驗證對象的 MemberName,通過調用Validator.ValidateProperty靜態方法,檢查目標數據是否符合當前驗證屬性,如果返回 False,則拋出一個ValidationException。
上面代碼也可簡寫爲:
當運行實例後,輸入空格在郵件文本框中,Silverlight的DataAnnotation驗證機制將被激活,生成如下效果:
在理解了上面的Silverlight的DataAnnotation驗證機制的基本類和屬性後,我們可以做幾個簡單的實例,來加深理解。
1. StringLength ,定義Password密碼框最大可輸入6個字符,
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 >
2 [StringLength( 6 , ErrorMessage = " 密碼不能超過6個字符 " )]
3 public string password
4 {
5 get { return _password; }
6 set
7 {
8 Validator.ValidateProperty(value, new ValidationContext( this , null , null ) { MemberName = " password " });
9 _password = value;
10 }
11 }
2. Range ,我們使用Range屬性設置Age年齡的有效範圍,
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 >
2 [Range( 0 , 100 , ErrorMessage = " 請輸入年齡值在0 - 100之間 " )]
3 public int Age
4 {
5 get { return _age; }
6 set
7 {
8 Validator.ValidateProperty(value, new ValidationContext( this , null , null ) { MemberName = " Age " });
9 _age = value;
10 }
11 }
3. RegularExpression ,我們使用正則表達式屬性,驗證郵件輸入框。
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 >
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( this , null , null );
10 tmpValidator.MemberName = " email " ;
11 Validator.ValidateProperty(value, tmpValidator);
12 _email = value;
13 }
14 }
4. 自定義驗證方法的應用
我們創建一個簡單的自定義驗證方法,驗證用戶名是否爲jv9.
首先創建自定義驗證類,CustomizeValidation,在類中添加引用,using System.ComponentModel.DataAnnotations;
然後繼承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屬性中,進行調用,
2 [CustomizeValidation]
3 public string Name
4 {
5 get { return _name; }
6 set
7 {
8 Validator.ValidateProperty(value, new ValidationContext( this , null , null ) { 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服務下的驗證實例。
今天講到這裏,希望大家能夠有所收穫。