热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Silverlight实战指南:深入解析用户提交数据的验证与捕获机制

本文深入探讨了Silverlight中用户提交数据的验证与捕获机制,详细分析了四种主要的验证方法:基本异常处理、DataAnnotation注解、IDataErrorInfo客户端同步验证以及自定义验证策略。通过实例解析,帮助开发者更好地理解和应用这些机制,提升应用程序的数据处理能力和用户体验。

在以往的Validation系列中,介绍了四种Silverlight验证机制:

  1. 基本异常验证机制;
  2. DataAnnotation验证机制;
  3. IDataErrorInfo客户端同步验证机制;
  4. INotifyDataErrorInfo服务器端异步验证机制;

在每篇的实例中,大家都能发现这几种Silverlight Validation机制是根据异常主动触发的验证机制。本文将介绍另外一种常用验证方法,该验证方法是基于以上四种验证机制,我们称之为被动型触发验证。

 

概述

 

被动型触发验证,简单的理解,就是当用户交互时,通过用户行为被动激活Validation验证机制。简单的例子,一个需要注册用户的页面,

其表格中,没有任何填写数据,而初始化后,对该表格不进行验证处理,仅当用户点击“注册”按钮后,对需要填写的控件进行验证判断,这时就需要用到被动型触发验证。

 

UpdateSourceTrigger属性

 

UpdateSourceTrigger属性是Validation数据验证的重要属性之一,该属性主要表示数据源触发更新的执行时间。主要运用在Binding中,例如

 
 

< TextBox   Text =" {Binding Username, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True, 
ValidatesOnExceptions=True, UpdateSourceTrigger=Explicit} " />


 


通过MSDN,我们可以了解到UpdateSourceTrigger属性有两个值,

 

1. Default,该值返回目标依赖属性的默认UpdateSourceTrigger值,多数控件返回的默认值为PropertyChanged,而Text属性的默认值为LostFocus。

2. Explicit,如果设置UpdateSourceTrigger属性设置为显式方式,则需要开发人员手工调用UpdateSource方法,才能对数据源更新事件进行触发,否则不做任何操作。

 

在默认情况下,UpdateSourceTrigger属性为Default。这也就是尽管在前几篇的实例中,在Binding中,我们没有设置任何PropertyChanged信息,仍旧能够触发验证。

当数据绑定被修改后,绑定会自动触发UpdateSourceTrigger属性,通过该属性,对绑定数据源的数据成员进行验证,如果有异常,则返回False,反之为True。

 

提交数据验证捕获实例

 

在文章开始,我们介绍了被动型触发验证方法,该方法在实际项目中是常用功能之一。前文提及的一个例子,注册时,想要在用户点击“注册”按钮时对所有填写值使用Validation功能进行判断,

其实现方法则需要将UpdateSourceTrigger属性设为Explicit,在后台中,我们使用代码控制其验证,通过这种方法,对提交数据进行验证捕获操作。

 

下面的例程,我们仍旧使用SilverlightValidationDemo项目,如果你没有该项目,可以到上一篇下载该项目源代码,

 

在本例中,我们将尝试点击提交注册按钮,但是在点击“注册”时,对姓名,密码和年龄进行验证判断。在没有对代码修改前,点击“注册”按钮,页面不会捕获任何数据提交验证,

我们将对姓名,密码和年龄代码进行简单修改

 

 

< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="用户名: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtUserName"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  
Text =" {Binding Path=Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True,UpdateSourceTrigger=Explicit} "   />  
            
StackPanel >  
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="密   码: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtPassword"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  
Text =" {Binding Path=password, Mode=TwoWay,ValidatesOnExceptions=True, NotifyOnValidationError=True,UpdateSourceTrigger=Explicit} "   />  
            
StackPanel >  
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="年   龄: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtAge"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  
Text =" {Binding Path=Age, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True,UpdateSourceTrigger=Explicit} "   />  
            
StackPanel >

 

 

 

从上面代码可以看出,我们在Binding中,添加UpdateSourceTrigger=Explicit,根据上文提示,我们必须手工对数据源进行更新触发。

 

这里需要解释一点,如果UpdateSourceTrigger=Default,当绑定模式为Twoway时,TextBox失去焦点,则会触发数据源更新,

这一切都有Silverlight API控制,而我们设置UpdateSourceTrigger=Explicit后,则由开发人员控制。

UpdateSourceTrigger设置为Explicit后,我们需要手动调用UpdateSource,才能对数据源进行验证。

在UpdateSource前,我们需要使用代码获取到绑定对象的实例。获取绑定对象实例,需要使用到BindingExpression类,BindingExpression类中包含了一个绑定对象实例的所有信息。

而获取一个BindingExpression对象,则需要使用GetBindingExpression方法,对验证目标对象属性进行捕获。

 

例如,我们实例中的代码:

 

BindingExpression beUsername  =  txtUserName.GetBindingExpression(TextBox.TextProperty); 
beUsername.UpdateSource();

 

通过txtUserName.GetBindingExpression获取TextBox对象的TextProperty绑定属性,然后赋值到beUsername。

然后调用UpdateSource方法,实现手工更新数据源,同时,数据源的修改,自然也就被动激活了后台的验证机制。

在实际项目中,仅获取到了验证错误信息,还是不够的,页面还是会继续进行下一步流程代码,而这里,我们将会使用Validation类中的方法和属性,对验证错误进行简单的判断,

 

private   void  btReg_Click( object  sender, RoutedEventArgs e) 

    BindingExpression beUsername 
=  txtUserName.GetBindingExpression(TextBox.TextProperty); 
    beUsername.UpdateSource(); 

    
if  (Validation.GetHasError(txtUserName)) 
        
return
}

 

 

 

上面代码,使用Validation类中的GetHasError()方法确认验证是否有错误,如果有,则返回空,UI的Validation机制将会接管前台验证错误显示,而后台,则会忽略该点击事件操作。

如果你想获取跟为详细的验证错误信息提示,可以通过Validation类中的GetErrors()方法枚举出所有被捕获的验证错误信息。

 

 

List < ValidationError >  errors  =   new  List < ValidationError > (); 
foreach  (ValidationError erroritem  in  Validation.GetErrors(txtUserName)) 

     errors.Add(erroritem); 
}

 

 

 

 

 

最终注册提交代码如下:

 

 

         private   void  btReg_Click( object  sender, RoutedEventArgs e)
        {
            BindingExpression beUsername 
=  txtUserName.GetBindingExpression(TextBox.TextProperty);
            beUsername.UpdateSource();
            BindingExpression bePassword 
=  txtPassword.GetBindingExpression(TextBox.TextProperty);
            bePassword.UpdateSource();
            BindingExpression beAge 
=  txtAge.GetBindingExpression(TextBox.TextProperty);
            beAge.UpdateSource();


            
if  (Validation.GetHasError(txtUserName))
                
return ;
            
if  (Validation.GetHasError(txtPassword))
                
return ;
            
if  (Validation.GetHasError(txtAge))
                
return ;


// 捕获验证错误集合演示
            List < ValidationError >  errors  =   new  List < ValidationError > ();
            
foreach  (ValidationError erroritem  in  Validation.GetErrors(txtUserName))
            {
                errors.Add(erroritem);
            }
        }

 

 

其结果,点击“注册”按钮,则会提示验证错误,修改内容后,再次点击“注册”按钮,验证通过后,进入注册流程。

 

 

最后需要说明一点,这种验证方法,和验证机制是无关的,无论使用哪一种验证机制,都可以使用该方法,进行用户交互数据验证。

今天就介绍到这里,希望对大家有所帮助。

 

 

源代码下载

 

 

 

欢迎大家加入“专注Silverlight”QQ技术群,目前,1-6群都已经满员,新开500人七群,欢迎大家加入一起学习讨论Silverlight&WPF开发技术。
22308706(一群) 超级群500人满
37891947(二群) 超级群500人满
100844510(三群) 高级群200人满
32679922(四群) 超级群500人满
23413513(五群) 高级群200人满
32679955(六群) 超级群500人满
61267622(七群 推荐) 超级群500人未满


推荐阅读
  • 如何使用和示例代码解析 org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom.getPropertyChain() 方法 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • 在Android开发中,实现多点触控功能需要使用`OnTouchListener`监听器来捕获触摸事件,并在`onTouch`方法中进行详细的事件处理。为了优化多点触控的交互体验,开发者可以通过识别不同的触摸手势(如缩放、旋转等)并进行相应的逻辑处理。此外,还可以结合`MotionEvent`类提供的方法,如`getPointerCount()`和`getPointerId()`,来精确控制每个触点的行为,从而提升用户操作的流畅性和响应性。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
author-avatar
小娟2502895183
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有