Silverlight輸入數據驗證系列六

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實例教程系列,到這裏即將完結,如果大家在閱讀中,或者項目中遇到問題或者有不同的意見,

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

 

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

 

 源代碼下載

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