技巧:在Silverlight应用程序中进行数据验证

概述

众所周知,在ASP.NET应用程序中,我们可以使用验证控件进行数据输入的验证,遗憾的是在Silverlight中并没有提供任何验证控件,但Silverlight对于双向数据绑定还是提供了一些基本的数据验证支持,我们可以在set设置器中定义验证规则,并对于不合法数据抛出异常,最后通过捕获验证错误事件来实现数据的验证。

本文将介绍在Silverlight应用程序中如何进行数据验证。

准备知识

Silverlight中如下两种情况下,将会触发验证错误:

1.在绑定引擎中执行数据转换时抛出异常

2.在业务实体的set设置器中抛出异常

为了在验证出错时能够接收到通知,我们必须要在绑定对象上设置如下两个属性为true:

ValidatesOnExceptions:告诉绑定引擎当有异常发生时创建一个验证异常

NotifyOnValidationError:告诉绑定引擎当有验证错误发生或者错误排除时触发BindingValidationError事件

这两个属性都定义在Binding类中,如下代码所示:

TerryLee_0154

BindingValidationError事件定义在FrameworkElement中,通过它可以接收到ValidationErrorEventArgs类型的参数,而在ValidationErrorEventArgs中定义了一个很重要的属性Action,它的定义如下:

TerryLee_0155

这里Added表示新增一个验证异常,Removed表示排除了一个验证异常。下面通过一个实例我们看一下如何使用它们进行数据的验证。

实例

首先我们编写一个简单的业务类,由于数据绑定验证只能在双向绑定中,所以这里需要实现INotifyPropertyChanged接口,如下代码所示,在set设置器中我们对于数据的合法性进行检查,如果不合法则抛出一个异常:

/// <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));
        }
    }
}

编写数据绑定,如下代码所示,设置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>

实现BindingValidationError事件,在这里可以根据ValidationErrorEventAction来判断如何进行处理,在界面给出相关的提示信息等,如下代码所示:

/// <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 = "年龄验证成功";
        messageAge.Validation = true;
    }
}

好了,现在来看一下最后的验证效果,如下图所示:

TerryLee_0156

TerryLee_0157

通过这样的方式,我们就可以在Silverlight中对于数据输入做验证了。

总结

本文介绍了如何在Silverlight应用程序进行数据验证,希望对大家有所帮助。更多Silverlight 2的文章请参考Silverlight 2 相关文章汇总

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-07-29 23:37 TerryLee 阅读(6516) 评论(38)  编辑 收藏 网摘 所属分类: [03]  银光点亮世界

  回复  引用  查看    
#1楼 2008-07-29 23:36 | sora      
一直关注楼主的这系列文章,学习……
  回复  引用  查看    
#2楼 2008-07-30 00:02 | 水果阿生      
好文章继续啊
  回复  引用  查看    
#3楼 [楼主]2008-07-30 00:59 | TerryLee      
@sora
谢谢:)
  回复  引用  查看    
#4楼 [楼主]2008-07-30 01:00 | TerryLee      
@水果阿生
有老苏的支持,一定要继续,呵呵:)
  回复  引用  查看    
#5楼 2008-07-30 07:55 | 木野狐(Neil Chen)      
绑定似乎不是那么好用. 特别在有第三方控件的时候,很多控件做的绑定语法不一样甚至不支持绑定。

现在我除了简单的显示用下绑定,编辑界面都用最原始的写法设值/取值了。这样也不会太麻烦,自由度还大些。
  回复  引用  查看    
#6楼 2008-07-30 08:42 | 王孟军!      
速度太快了,老兄是不是一边吃饭还一边干活呢?~-~
  回复  引用  查看    
#7楼 2008-07-30 08:56 | jillzhang      
@王孟军!
谁说的!
老李分明是一边睡觉一边写文章的。
  回复  引用  查看    
#8楼 2008-07-30 09:32 | Windie Chai(笑煞天)      
好文!Terry的研究越来越深入了。
  回复  引用  查看    
#9楼 [楼主]2008-07-30 09:56 | TerryLee      
@木野狐(Neil Chen)
很多东西是由于现在Silverlight 2还不稳定,所以第三方控件的支持就比较少,等Release之后,我相信绑定还是挺好用的:)
  回复  引用  查看    
#10楼 [楼主]2008-07-30 09:56 | TerryLee      
@王孟军!
没有啊,吃饭时我是一边吃饭一边看电视,呵呵:)
  回复  引用  查看    
#11楼 [楼主]2008-07-30 09:57 | TerryLee      
@jillzhang
这……:)
  回复  引用  查看    
#12楼 [楼主]2008-07-30 09:57 | TerryLee      
@Windie Chai(笑煞天)
谢谢支持啊:)
  回复  引用  查看    
#13楼 2008-07-30 10:35 | 王国金      
支持老大呢。写的很好。希望老大继续。
  回复  引用  查看    
#14楼 2008-07-30 11:30 | 王国金      
老大为什么不把整个这个解决方案贴上来呢。
在上面的业务类中,我居然不能继承INotifyPropertyChanged接口
  回复  引用  查看    
#15楼 [楼主]2008-07-30 11:32 | TerryLee      
@王国金
谢谢支持:)
  回复  引用  查看    
#16楼 [楼主]2008-07-30 11:33 | TerryLee      
@王国金
很多时候为了让大家能够思考饼自己动手尝试一下

引入using System.ComponentModel命名空间
  回复  引用  查看    
#17楼 2008-07-30 11:40 | 王国金      
老大,我引入了。呵呵。
错误 1 “Validation.Person”不实现接口成员“System.ComponentModel.INotifyPropertyChanged.PropertyChanged” E:\5fad_com\5fad\vs08\Validation\Validation\person.cs 16 18 Validation
报错。
如果老大觉得可以的话,请你把上面的那个DEMO发上来,如何?我自己再研究一下。
  回复  引用  查看    
#18楼 2008-07-30 11:55 | 王国金      
老大,上面的错误搞定了。是我实现INotifyPropertyChanged 这个接口时,把PropertyChanged 打错了,但是我还是有点不清楚。
<my:Message x:Name="messageAge"></my:Message>
这个是不是你自定义控件中,请问这里你是实现了哪些
  回复  引用  查看    
#19楼 2008-07-30 11:59 | nasa      
cool 这个太棒了
  回复  引用  查看    
#20楼 [楼主]2008-07-30 12:33 | TerryLee      
@王国金
这个是我定义的一个UserControl,其实大可以不用,用一个TextBlock就行,具体的控制是在BindingValidationError事件中的,所以跟这个UserControl没什么关系。
  回复  引用  查看    
#21楼 [楼主]2008-07-30 12:35 | TerryLee      
@nasa

呵呵,不过实现起来还是有些麻烦,我正在考虑怎么封装一下,搞成个控件什么的,让验证更为简单。
  回复  引用  查看    
#22楼 2008-07-30 13:58 | 王国金      
呵呵。期待老大封装成一个控件。:)
  回复  引用    
#23楼 2008-07-30 16:07 | Apple.Yang [未注册用户]
我silverlight 安装了快一个礼拜了。
vs2008 中文版的,下了silverchainer 中文版安装包,安装到接近结束时,bia ji,致命性错误,安装失败
我机子上没有kb949325,也没有安装其他版本的silverlight。
求助,谁能帮我?
  回复  引用  查看    
#24楼 [楼主]2008-07-31 01:11 | TerryLee      
@王国金
呵呵,不过我还没想好怎么去做呢:)
  回复  引用  查看    
#25楼 [楼主]2008-07-31 01:12 | TerryLee      
@Apple.Yang
没有什么错误信息呢?
  回复  引用  查看    
#26楼 2008-07-31 18:48 | Mahon      
跑来支持
  回复  引用  查看    
#27楼 [楼主]2008-08-01 00:56 | TerryLee      
@Mahon
感动中……:)
  回复  引用    
#28楼 2008-08-03 21:21 | zhengming [未注册用户]
有点麻烦..
老大写点Cross Domain Policy Files的文章撒.E文的看起累..
  回复  引用  查看    
#29楼 [楼主]2008-08-03 22:23 | TerryLee      
@zhengming
是麻烦了一些,但也算是一种方法,呵呵

跨域调用其实没那么负责,有空我会写一篇文章。
  回复  引用  查看    
#30楼 2008-08-05 17:51 | DataFlow      
楼主的方法很好,但我还是喜欢简简单单的实体类,看着舒服,用着也清楚。
  回复  引用  查看    
#31楼 [楼主]2008-08-06 13:19 | TerryLee      
@DataFlow
我也喜欢简简单单的,呵呵,但这是唯一的验证办法……
  回复  引用  查看    
#32楼 2008-08-14 00:18 | Clingingboy      
估计以后会直接验证实体类.
  回复  引用  查看    
#33楼 2008-08-28 13:57 | dino623      
if (value < 0)
throw new Exception("年龄输入不合法!");
================================
在BETA2不能这么用吗?一直报未处理异常
  回复  引用  查看    
#34楼 [楼主]2008-08-29 10:05 | TerryLee      
@dino623
文本就是在Beta 2环境下完成的。
  回复  引用  查看    
#35楼 2008-08-29 12:09 | dino623      
@TerryLee
我用的是BETA 2.2环境,可是实现基本的验证,例如在INT的文本框输入字符串e.Error.Exception.Message的结果就是“输入字符串的格式不正确”,如果输入正确的整数,到了这一步
if (value.Length < 4)
throw new Exception("姓名输入不合法!");
就会报“未处理的异常”,请LZ解答


  回复  引用  查看    
#36楼 [楼主]2008-08-29 23:25 | TerryLee      
@dino623
Beta 2.2?没听说过微软发布了这么一个版本啊。

“输入字符串的格式不正确”这个提示信息在哪儿定义的?没看明白你所说的问题,还是贴段代码吧,
  回复  引用  查看    
#37楼 2008-09-03 11:48 | yuonh      
找不到messageAge.Validation 这属性、、、
我是2.0 bata2版本的。
  回复  引用  查看    
#38楼 [楼主]2008-09-03 21:43 | TerryLee      
@yuonh
Message控件是自定义的一个控件,而Validation属性时需要在该控件中自己定义的,呵呵

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索




相关链接: