|
概述
眾所周知,在ASP.NET應(yīng)用程序中,我們可以使用驗(yàn)證控件進(jìn)行數(shù)據(jù)輸入的驗(yàn)證,遺憾的是在Silverlight中并沒(méi)有提供任何驗(yàn)證控件,但Silverlight對(duì)于雙向數(shù)據(jù)綁定還是提供了一些基本的數(shù)據(jù)驗(yàn)證支持,我們可以在set設(shè)置器中定義驗(yàn)證規(guī)則,并對(duì)于不合法數(shù)據(jù)拋出異常,最后通過(guò)捕獲驗(yàn)證錯(cuò)誤事件來(lái)實(shí)現(xiàn)數(shù)據(jù)的驗(yàn)證。
本文將介紹在Silverlight應(yīng)用程序中如何進(jìn)行數(shù)據(jù)驗(yàn)證。
準(zhǔn)備知識(shí)
Silverlight中如下兩種情況下,將會(huì)觸發(fā)驗(yàn)證錯(cuò)誤:
1.在綁定引擎中執(zhí)行數(shù)據(jù)轉(zhuǎn)換時(shí)拋出異常
2.在業(yè)務(wù)實(shí)體的set設(shè)置器中拋出異常
為了在驗(yàn)證出錯(cuò)時(shí)能夠接收到通知,我們必須要在綁定對(duì)象上設(shè)置如下兩個(gè)屬性為true:
ValidatesOnExceptions:告訴綁定引擎當(dāng)有異常發(fā)生時(shí)創(chuàng)建一個(gè)驗(yàn)證異常
NotifyOnValidationError:告訴綁定引擎當(dāng)有驗(yàn)證錯(cuò)誤發(fā)生或者錯(cuò)誤排除時(shí)觸發(fā)BindingValidationError事件
這兩個(gè)屬性都定義在Binding類中,如下代碼所示:
BindingValidationError事件定義在FrameworkElement中,通過(guò)它可以接收到ValidationErrorEventArgs類型的參數(shù),而在ValidationErrorEventArgs中定義了一個(gè)很重要的屬性Action,它的定義如下:
這里Added表示新增一個(gè)驗(yàn)證異常,Removed表示排除了一個(gè)驗(yàn)證異常。下面通過(guò)一個(gè)實(shí)例我們看一下如何使用它們進(jìn)行數(shù)據(jù)的驗(yàn)證。
實(shí)例
首先我們編寫一個(gè)簡(jiǎn)單的業(yè)務(wù)類,由于數(shù)據(jù)綁定驗(yàn)證只能在雙向綁定中,所以這里需要實(shí)現(xiàn)INotifyPropertyChanged接口,如下代碼所示,在set設(shè)置器中我們對(duì)于數(shù)據(jù)的合法性進(jìn)行檢查,如果不合法則拋出一個(gè)異常:
/// <summary>/// Author:TerryLee/// http://www.cnblogs.com/Terrylee/// </summary>public class Person : INotifyPropertyChanged{ public event PropertyChangedEventHandler PropertyChanged; private int _age; public int Age { get { return _age; } set { if (value < 0) throw new Exception("年齡輸入不合法!"); _age = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Age")); } } } private String _name = "Terry"; public String Name { get { return _name; } set { if (value.Length < 4) throw new Exception("姓名輸入不合法!"); _name = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Name")); } } } public void NotifyPropertyChanged(String propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }}
編寫數(shù)據(jù)綁定,如下代碼所示,設(shè)置NotifyOnValidationError和ValidatesOnExceptions屬性為true,并且定義BindingValidationError事件:
<!-- http://www.cnblogs.com/Terrylee--><StackPanel Orientation="Horizontal" Margin="10"> <TextBox x:Name="txtName" Width="200" Height="30" Text="{Binding Name,Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" BindingValidationError="txtName_BindingValidationError"> </TextBox> <my:Message x:Name="messageName"></my:Message></StackPanel><StackPanel Orientation="Horizontal" Margin="10"> <TextBox x:Name="txtAge" Width="200" Height="30" Text="{Binding Age,Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" BindingValidationError="txtAge_BindingValidationError"> </TextBox> <my:Message x:Name="messageAge"></my:Message></StackPanel>
實(shí)現(xiàn)BindingValidationError事件,在這里可以根據(jù)ValidationErrorEventAction來(lái)判斷如何進(jìn)行處理,在界面給出相關(guān)的提示信息等,如下代碼所示:
/// <summary>/// Author:TerryLee/// http://www.cnblogs.com/Terrylee/// </summary>void txtAge_BindingValidationError(object sender, ValidationErrorEventArgs e){ if (e.Action == ValidationErrorEventAction.Added) { messageAge.Text = e.Error.Exception.Message; messageAge.Validation = false; } else if (e.Action == ValidationErrorEventAction.Removed) { messageAge.Text = "年齡驗(yàn)證成功"; messageAge.Validation = true; }}
好了,現(xiàn)在來(lái)看一下最后的驗(yàn)證效果,如下圖所示:
通過(guò)這樣的方式,我們就可以在Silverlight中對(duì)于數(shù)據(jù)輸入做驗(yàn)證了。
總結(jié)
本文介紹了如何在Silverlight應(yīng)用程序進(jìn)行數(shù)據(jù)驗(yàn)證,希望對(duì)大家有所幫助。
NET技術(shù):在Silverlight應(yīng)用程序中進(jìn)行數(shù)據(jù)驗(yàn)證,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。