Silverlight實例教程 - 自定義擴展Validation類,驗證框架的總結和建議

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

 

 

Silverlight Validation驗證實例教程系列已經寫了七篇 了, 今天將完成計劃中的最後一個話題,創建自定義擴展驗證類,本篇是根據一些讀者反饋的問題總結而來的,在本篇最後,將簡單的對目前Silverlight Validation驗證框架提供的驗證機制進行總結性的對比和歸納,希望能夠幫助大家在實際項目中定位和應用驗證框架。

 

閱讀過前幾篇Silverlight實例教程的朋友,給我留言和來信,大家對於Silverlight Validation類的使用,總感覺有些不靈活,特別是在自定義使用時,很難輕鬆的控制錯誤驗證的捕獲和彈出。 下面,我將演示另外一個實例,該實例將幫助開發人員創建自定義擴展Validation類,該類允許開發人員,方便的控制驗證錯誤彈出,驗證錯誤清除,以 及驗證校驗方法。

 

Silverlight Validation自定義擴展類

本實例仍舊使用SilverlightValidationDemo項目,在Mainpage中創建一個簡單的UI,進行演示:

 

 

 

< StackPanel  Margin ="5" >  
                 
< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="產品名: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtProduct"  Width ="200"   />  
            
</ StackPanel >  
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="數  量: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtAmount"  Width ="200"    />  
            
</ StackPanel >  
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="單  價: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtPrice"  Width ="200"   />  
            
</ StackPanel >  
            
< StackPanel  Orientation ="Horizontal"   >  
                
< Button  x:Name ="btBuy"  Content ="購  買"  Margin ="5"   />  
                
< Button  x:Name ="btReset"  Content ="重  置"  Margin ="5"   />  
            
</ StackPanel >  
</ StackPanel >

 

 

 

 

根據上圖,我們看到,我們將對產品名,產品數量和產品單價進行驗證,在Xaml代碼中,沒有對Text進行綁定,這些,我們將在代碼中進行實現。

在完成上面UI的創建,我們需要創建一個靜態類ValidationExtension,在該類中,我們將創建自定義驗證方法,以及驗證錯誤信息控制方法。

 

在ValidationExtension類中,我們將使用以下三個靜態方法,接管Silverlight Validation默認的驗證捕獲,其代碼分別是:

 

public   static   void  SetValidation( this  FrameworkElement frameworkElement,  string  message) 

            CustomizeValidation customValidation 
=   new  CustomizeValidation(message); 

            Binding binding 
=   new  Binding( " ValidationError "
            { 
                Mode 
=  System.Windows.Data.BindingMode.TwoWay, 
                NotifyOnValidationError 
=   true
                ValidatesOnExceptions 
=   true
                Source 
=  customValidation 
            }; 
            frameworkElement.SetBinding(Control.TagProperty, binding); 
}

 

 

 

SetValidation靜態方法,將設置FrameworkElement元素綁定ValidationError驗證錯誤信息,其中設置 NotifyOnValidationError 和ValidatesOnExceptions 爲True,允許控件對異常和驗證錯誤進行捕獲和反饋。

 

 

public   static   void  RaiseValidationError( this  FrameworkElement frameworkElement) 
        { 
            BindingExpression b 
=  frameworkElement.GetBindingExpression(Control.TagProperty); 

            
if  (b  !=   null
            { 
                ((CustomizeValidation)b.DataItem).ShowErrorMessage 
=   true
                b.UpdateSource(); 
            } 
        }

 

RaiseValidationError靜態方法,在驗證錯誤綁定後,通過該方法將錯誤異常顯示在客戶端,通過UpdateSource方法更新客戶端錯誤異常顯示。簡單的理解就是在客戶端控件對象,彈出異常錯誤提示信息。

 

 

public   static   void  ClearValidationError( this  FrameworkElement frameworkElement) 
        { 
            BindingExpression b 
=  frameworkElement.GetBindingExpression(Control.TagProperty); 

            
if  (b  !=   null
            { 
                ((CustomizeValidation)b.DataItem).ShowErrorMessage 
=   false
                b.UpdateSource(); 
            } 
        }

 

 

 

ClearValidationError靜態方法,和RaiseValidationError靜態方法正好相反,調用該方法將清空當前對象上顯示的異常錯誤信息。

 

以上三個方法的調用,將在後文演示。下面需要添加簡單的驗證條件,幫助客戶端捕獲驗證錯誤信息,爲了方便起見,這裏,創建了對數字的判斷和對雙精度型的數據判斷,代碼如下:

 

 

public   static   bool  IsNumberValid( this   string  inputNumber) 
        { 
            
bool  isNumberValid  =   true
            
int  number  =   - 1
            
if  ( ! Int32.TryParse(inputNumber,  out  number)) 
            { 
                isNumberValid 
=   false
            } 
            
return  isNumberValid; 
        } 

 

 

IsNumberValid靜態方法,判斷當前對象中輸入字符是否爲數字;

 

public   static   bool  IsPriceValid( this   string  inputPrice) 
        { 
            
bool  isPriceValid  =   true
            
double  minprice  =   8.8

            
if  (Convert.ToDouble(inputPrice)  <  minprice) 
            { 
                isPriceValid 
=   false
            } 
            
return  isPriceValid; 
        } 

 

 

IsPriceValid靜態方法,判斷當前對象中輸入字符是否大於最小价格,如果False,則返回驗證錯誤。

 

這裏大家已經留意到,ValidationExtension自定義擴展類沒有繼承和實現任何驗證類或接口,獨立存在。

 

在以上靜態方法中,我們用到了CustomizeValidation自定義驗證類中的屬性成員,在過去的幾篇中,我們僅在CustomizeValidation中定義了一個簡單的自定義驗證方法,而現在我們需要添加兩個簡單的屬性和一個新的構造函數,其代碼如下:

 

#region  Private memebers 
        
private   string  message; 
        
#endregion  

        
#region  Public Property 
        
public   bool  ShowErrorMessage 
        { 
            
get
            
set
        } 

        
public   object  ValidationError 
        { 
            
get  
            { 
                
return   null
            } 
            
set  
            { 
                
if  (ShowErrorMessage) 
                { 
                    
throw   new  ValidationException(message); 
                } 
            } 
        } 
#endregion

 

 

構造函數:

 

public  CustomizeValidation( string  message) 
        { 
            
this .message  =  message; 
        }

 

 

其目的是爲了收集驗證錯誤信息。

 

完成了以上自定義代碼後,我們可以在客戶端進行簡單的調用代碼設置:

 

目前,我們希望,點擊“購買”按鈕後,對用戶輸入信息進行驗證判斷,如果有錯誤異常,則彈出驗證錯誤信息,

這裏我們僅需要添加部分代碼到btBuy.Click事件即可。

 

 

#region  Validation Extension 
        
private   void  btBuy_Click( object  sender, RoutedEventArgs e) 
        { 
            
bool  isValid  =   true

            txtProduct.ClearValidationError(); 
            txtAmount.ClearValidationError(); 
            txtPrice.ClearValidationError(); 

            
if  (txtProduct.Text  ==   ""
            { 
                txtProduct.SetValidation(
" 請輸入產品名稱 " ); 
                txtProduct.RaiseValidationError(); 
                isValid 
=   false
            } 

            
if  (txtAmount.Text  ==   ""   ||   ! txtAmount.Text.IsNumberValid()) 
            { 
                txtAmount.SetValidation(
" 請輸入一個整數 " ); 
                txtAmount.RaiseValidationError(); 
                isValid 
=   false
            } 

            
if  (txtPrice.Text  ==   ""   ||   ! txtPrice.Text.IsPriceValid()) 
            { 
                txtPrice.SetValidation(
" 最小出價8.8 " ); 
                txtPrice.RaiseValidationError(); 
                isValid 
=   false
            } 

            
if  (isValid) 
            { 
                HtmlPage.Window.Alert(
" 產品購買成功 " ); 
                ResetForm(); 
            } 
        } 

        
private   void  btReset_Click( object  sender, RoutedEventArgs e) 
        { 
            ResetForm(); 
        } 

        
private   void  ResetForm() 
        {

             txtProduct.ClearValidationError(); 
            txtAmount.ClearValidationError(); 
            txtPrice.ClearValidationError(); 

            txtProduct.Text 
=   ""
            txtAmount.Text 
=   ""
            txtPrice.Text 
=   ""
        } 
#endregion

 

 

 

通過SetValidation,設置驗證錯誤提示信息,通過RaiseValidationError彈出驗證錯誤信息,每次點擊前,調用ClearValidationError清空當前驗證錯誤。最終執行結果如下:

 

 

 

到這裏,我們已經完成了一個自定義擴展Validation類,大家可以根據這個思路擴展更多的驗證校驗方法,並應用到項目控件中。

 

Silverlight Validation驗證機制對比總結和建議

 

在過去的幾篇中,我們曾經詳細介紹了四種Silverlight Validation驗證機制,分別是

 

  • 基本異常驗證機制;
  • DataAnnotation驗證機制;
  • IDataErrorInfo客戶端同步驗證機制;
  • INotifyDataErrorInfo服務器端異步驗證機制;

    一些朋友發郵件問我,這些驗證機制在項目中的優勢是什麼?在實際項目中,如何選擇適當的驗證機制?下面有個簡單的列表,將以上四種驗證機制進行簡單的歸納總結:

 

驗證機制

優勢

劣勢

基本異常驗證機制

1. 適用任何數據類型驗證;

2. 使用方法簡單,僅需在Xaml代碼中設置即可;

1. 只能在屬性Setter中使用;

2. 不支持自定義方法驗證

3. 每個成員每次僅能捕獲一個驗證錯誤

DataAnnotation驗證機制

1. 不會引發異常錯誤;

2. 每個成員可以使用多個驗證條件;

3. 使用方法簡單,僅需聲明屬性即可;無需過多編寫代碼;

4. 支持自定義方法驗證;

僅適合用於Datagrid和Dataform和一些可使用DataAnnotation屬性的第三方控件

IDataErrorInfo客戶端同步驗證機制

1. 不會引發異常錯誤;

2. 支持自定義方法驗證;

1. 不能捕獲數據類型驗證錯誤;

2. 每個數據成員每次僅能捕獲一個驗證錯誤;

3. 使用方法較爲複雜;

INotifyDataErrorInfo服務器端異步驗證機制

1. 不會引發異常錯誤;

2. 支持自定義方法驗證;

3. 支持服務器端異步驗證;

4. 每個成員可以使用多個驗證條件;

1. 不能捕獲數據類型驗證錯誤;

2. 多條件驗證下,僅支持顯示第一個驗證錯誤;

3. 使用方法複雜;

 

在使用Silverlight Validation框架是需要注意以下幾點:

 

1. 使項目支持異常捕獲,這樣驗證框架可支持數據類型校驗;

2. 如果使用Datagrid和Dataform控件,推薦使用DataAnnotation驗證機制;

3. 如果需要在客戶端驗證所有信息,推薦使用IDataErrorInfo驗證機制;

4. 如果需要使用服務器端的驗證方法,推薦使用INotifyDataErrorInfo驗證機制。

 

相信大家在明白了以上各個驗證機制的優勢和劣勢後,已經可以輕鬆掌握Silverlight Validation驗證框架的應用了。

Silverlight Validation實例教程系列,到這裏即將完結,如果大家在閱讀中,或者項目中遇到問題或者有不同的意見,

歡迎留言給我,我們一起討論學習。

 

最後感謝每一位支持的朋友。

 

源代碼下載

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