热门标签 | 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人未满


推荐阅读
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
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社区 版权所有