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

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://kevinfan.blog.51cto.com/1037293/389774

 

 

在學習了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( this null null );
 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( this null null ) { 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( this null null ) { 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( 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 ,我們使用正則表達式屬性,驗證郵件輸入框。

 

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( 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類,使其預定義該類爲自定義驗證屬性,

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

 

 

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( 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服務下的驗證實例。

 

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

 

源代碼下載

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