【翻译】多域校验控件——基于ASP.NET的验证控件[Carol]

多域校验控件——基于ASP.NET的验证控件

  原文地址:http://www.codeproject.com/aspnet/MultipleFieldsValidator.asp

作者:Adam Tibi  翻译: Carol

      我们探讨的是多域的校验,是指校验一组域,其中至少有一个域是必须被检验的,如电话号码,手机号或者电子邮件。它继承自BaseValidator并且使用了一些又新又炫的ASP.NET2.0特性。

clip_image001

导言

在理想世界中,网页使用者无需认证,因为他们是值得信赖的,那里将不会有千年虫或者任何不可预期的行为,所以也不用try-catch。使用者将提交有效的输入,因此你也无需使用网页校验。但是既然我们不是生活在那样的世界中,我希望一段时间后你们会发现这种校验是有用的。

在ASP.NET开发过程中,我遇到过许多案例:在许多备选域中你只需填充一个域。在这些域中进行校验,我曾习惯于用自定义校验,或者客户端脚本,或者有时只用服务器端验证。

使用自定义校验以及所有其他ASP.NET校验的问题在于:它们主要用于处理一个或两个域,而且每次遇到校验多个域时,你都需要写自定义的服务器端或客户服务器端代码,或者也许就是复制和粘贴代码。为了解决这一问题,我制作了这个轻量级的多控件的校验控件,并且使用了新的ASP.NET 2.0特性。

背景

即使使用ASP.NET 2.0,许多珍贵的校验控件都在丢失,尤其是那些用于多域的校验。Peter Blum创造了一套叫做Professional Validation And More(专业校验及更多)的商业控件来填补这一缺口。他在回答我的论坛的帖子时,给了我实践自己的校验控件的想法。

在CodeProject上我也发现了一些由Daniel Hacquebord著的关于CustomValidator dependent on multiple controls(基于多控件的定制校验控件)的好文章。它提出了一种同样的需要。这种校验控件具备以下几个优势:

1. 不需要写任何客户端或服务端代码。只需将它拖到页面上然后指定你想校验的控件。

2. HTML/XHTML兼容。它用JavaScript指定附加属性,而不是将附加属性直接添加到span标签。也就是说,它使用JavaScript

document["MyMultipleFieldsValidator"].condition = "OR"

而不是 HTML <span id="MyMultipleFieldsValidator" condition = "OR">.

3. 使用.js资源档案来注册客户端代码,而不用在每一张需要这一控件的页面上写客户代码。

4. 直接从BaseValidator继承下来,相对于从 CusomValidator继承得到了一些细小的额外特性

在CodeProject上还有一篇好文章给了我一些启示,文章的题目是RequiredIfValidator - Extending from the BaseValidator class,是关于一种校验控件,用于校验基于下拉列表选择的另一个项。

使用代码

这个控件基于的BaseValidator,主要用于处理一个控件,所以我不得不禁用一些旨在校验一个单独控件的属性。我得把ControlToValidate 和SetFocusOnError属性覆盖,并把它们从设计者及Visual Studio编辑者那隐藏起来。

 

[Browsable( false )] 

[EditorBrowsable(EditorBrowsableState.Never)] 

public   new   bool  SetFocusOnError { 

get  { 

return   false



set  { 

throw   new  NotSupportedException( " SetFocusOnError is not supported. " ); 





[Browsable(
false )] 

[EditorBrowsable(EditorBrowsableState.Never)] 

public   new   string  ControlToValidate { 

get  { 

return   string .Empty; 



set  { 

throw   new  NotSupportedException( " ControlToValidate is not supported. " ); 




在AddAttributesToRender方法中我使用ASP.net 2.0提供的RegisterExpandoAttribute方法动态的将调用JavaScript的语句添加到由validator生成的<span>标签中而不是静态的写入页面这样可以保持HTML/XHTML代码的友好度

 

if ( this .RenderUplevel) { 

string  clientID  =   this .ClientID; 

Page.ClientScript.RegisterExpandoAttribute(clientID, 

" evaluationfunction "

" MultipleFieldsValidatorEvaluateIsValid " ); 

Page.ClientScript.RegisterExpandoAttribute(clientID, 

" controlstovalidate "

this .GenerateClientSideControlsToValidate()); 

Page.ClientScript.RegisterExpandoAttribute(clientID, 

" condition "

PropertyConverter.EnumToString(
typeof (Conditions), Condition)); 


在OnPreRender,我已经使用了新的ASP.NET 2.0方法:RegisterClientScriptResource,用以将我的嵌入的.js档案添加到页面。在CodeProject 上有一篇名为WebResource ASP.NET 2.0 explained的好文章是用于处理这一问题的,其作者是Gary Dryden。

 

protected   override   void  OnPreRender(EventArgs e) { 

base .OnPreRender(e); 

if  ( base .RenderUplevel) { 

this .Page.ClientScript.RegisterClientScriptResource( 

typeof (MultipleFieldsValidator), 

" AdamTibi.Web.UI.Validators.WebUIValidationExtended.js " ); 




使用校验控件

要从你的Visual Studio IDE中使用这一校验,你需要把提供的.dll添加到工具箱。关于这一点更多的信息,请点击MSDN documentation

在web form 上拖一个校验控件之后,你所需做的只要设置ControlsToValidate属性,在属性窗口上指出你想校验的控件。本文附带的演示有更多的例子。

默认状态下会被设置为OR的Condition属性设定了你校验多域时所要运用的条件。因此,OR确保其中一个域是需要被填写的,而XOR确保其中之一被检验而不是全部。

 

ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ Page Language="C#" AutoEventWireup="true"  %>  
None.gif
ExpandedBlockStart.gifContractedBlock.gif
<% dot.gif @ Register TagPrefix="atv" Namespace="AdamTibi.Web.UI.Validators" 
InBlock.gif
ExpandedBlockEnd.gifAssembly
="AdamTibi.Web.UI.Validators" 
%>  
None.gif
None.gif
<? xml version="1.0" encoding="UTF-8" ?>  
None.gif
None.gif
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
None.gif
None.gif"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
>  
None.gif
None.gif
< html  xmlns ="http://www.w3.org/1999/xhtml" >  
None.gif
None.gif
< head  id ="Head1"  runat ="server" >  
None.gif
None.gif
< title ></ title >  
None.gif
None.gif
</ head >  
None.gif
None.gif
< body >  
None.gif
None.gif
< form  id ="form1"  runat ="server" >  
None.gif
None.gif
< asp:TextBox  ID ="txtPhone"  runat ="server" ></ asp:TextBox >  
None.gif
None.gif
< asp:TextBox  ID ="txtMobile"  runat ="server" ></ asp:TextBox >  
None.gif
None.gif
< asp:TextBox  ID ="txtEmail"  runat ="server" ></ asp:TextBox >  
None.gif
None.gif
< atv:MultipleFieldsValidator  ID ="mfv"  runat ="server"  Condition ="OR"  
None.gif
None.gifControlsToValidate
="txtPhone,txtMobile,txtEmail" >  
None.gif
None.giffill at least one field
</ atv:MultipleFieldsValidator >  
None.gif
None.gif
</ form >  
None.gif
None.gif
</ body >  
None.gif
None.gif
</ html >  
None.gif

局限

我只在IE6和Firefox1.5上试验过此种校验,但我没有使用任何怪异的JavaScript,所以它也应该可以在其他浏览器上作用。如果你使用成功,请告知。

我只需要它来校验文本框领域,所以我没有使用其他类型的控件。但理论上说,它应该是有效的。如果你遇到任何问题也请告知。

结论

希望能令你一天都开心。如果喜欢这个文章请记得投票。如果有任何建议,故障或者提高请联系我。

转载于:https://www.cnblogs.com/dotLive/archive/2007/10/23/934501.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值