大家好,又见面了,我是你们的朋友全栈君。
13.3 验证控件的类型
到目前为止,已经讨论了验证的相关理论。ASP.NET 2.0提供了5种验证控件,表13-1对此进行了描述。然后,将介绍每种控件的细节,首先是表格式概述。
13.3.1 类型表
表 13-1
控 件 名 |
适 用 情 况 |
RequiredFieldValidator |
为了避免空值,例如当用户输入密码以建立新账户时 |
RangeValidator |
为了检查输入的值是否在限制的范围内。例如,对于青年俱乐部,出生日期字段应该指示年龄小于18岁 |
CompareValidator |
为了检查两个字段是否包含相同的值。例如,当创建密码时,用户应该输入密码两次以确保用户正确记住它 |
RegularExpressionValidator |
为了检查输入是否匹配关于字符性质的模式,例如字母与数字、大写字母与小写字母、日期的长度和有效性 |
CustomValidator |
为了检查输入符合以代码编写的规则。这可以包括复杂的评估,例如检验授权号中的模式 |
13.3.2 RequiredFieldValidator控件
在前面的示例中看到过,RequiredFieldValidator控件检查输入不为空。如同在大多数数据库工作中一样,一个或多个空格将仍然被认为是一个值。同样,数据源控件或数据库可能添加一个默认值,而RequiredFieldValidator不会考虑这种情况。
当使用DropDownList时,将自动选择列表中的第一项,直到用户进行其他的选择。因此,这里存在一个违反的行为,即RequiredFieldValidator将在用户没有进行选择时也会通过验证。如果希望强制在DropDownList中进行选择,可以使用如下的代码添加新的项到列表的顶部,且该项中没有值:
<asp:DropDownList ID=”DropDownList1″ runat=”server”
DataSourceID=”SqlDataSource1″
DataTextField=”pub_name”
DataValueField=”pub_id”
AppendDataBoundItems=”true”>
<asp:ListItem Value=”” Text=”Please select an option”/>
</asp:DropDownList>
考虑NULL可能是合法值的情况。如果期望空字符串表示空值,则完全不会使用必要的字段验证控件,因为空值实际上是有效的值(在数据库中转换为NULL)。如果期望特定的值表示空值,例如NA或NULL,则只有在将空字符串认为是无效值时才使用必要的字段验证控件。使用数据源控件或数据绑定控件的OnUpdating,OnInserting或OnDeleting事件中的代码,将NA或NULL字符串在服务器上转换为空值。
13.3.3 CompareValidator控件
CompareValidator控件检查两个项是否相同,其中一项是ControlToValidate。可以对以下3种对象的其中一种建立比较:
● 另一个控件中的值
● 硬编码的值、值列表或一些范围类型的值
● 数据类型
CompareValidator控件具有用于上述情况的ControlToCompare和Operator属性。它也有一个下面列出的Type属性。
将一个输入控件与另一个输入控件进行比较是最常见的比较情况。当要求用户输入关键的信息并且希望让用户输入其两次以确保正确输入该值(例如,电子邮件地址)时,这种比较情况就会在许多站点中引发。另一种常见的比较情况发生在用户第一次输入密码时。因为密码字段中的值一般不显示(使用掩饰字符代替),用户无法直观地检查其准确性。第二次输入密码并使用CompareValidator可解决该问题。注意,新密码的输入文本框将出现两次,但只有一个验证控件。在这种情况下,ControlToCompare属性被设置为第二个输入控件,并且Operator一般设置为等于。
也可以针对给定值使用CompareValidator控件。这可能是一个值,例如较低安全性的情况,其中对进入页面的所有成员使用相同的密码。CompareValidator控件中的ControlToCompare属性没有任何值,而ValueToCompare属性中则有一个值。Operator属性将被设置为等于。CompareValidator控件也提供了定量比较的能力,其方法是设置运算符为小于、大于或一些类似的选项。这些选项使CompareValidator控件类似于RangeValidator控件的功能,但具有较少的灵活性。例如,CompareValidator可以检查对StartDate输入值在对EndDate.Last输入值之前发生;CompareValidator将检查数据类型。例如,如果要求用户输入出生日期,则可能有多种格式。Operator属性可以被设置为DataTypeCheck,并且Type被设置为DateTime。
注意:
如果无意中同时包括了ControlToCompare和ValueToCompare属性,则使用ControlToCompare。
13.3.4 RangeValidator控件
RangeValidator控件确保输入值在上界和下界之中。验证的输入值可以是数字、货币、日期或(很少的情况)字符串。除了上面讨论的常见属性,有3个测试属性需要设置:MinimumValue,MaximumValue和Type,Type表示数据类型。上界值和下界值包括在内,因此比较类似于>=和<=。如果它们的属性分别被设置为5和10,则输入5和10是可接受的。如果将接受具有小数值的数字,则选择Double类型。
RangeValidator控件也有违反的情况。如果输入控件中没有数据存在,则RangeValidator控件将不会验证输入,并且不会抛出验证失败。为了确保具有输入值,并且该值在范围内,则必须添加第二个验证控件:RequiredFieldValidator。这种设计支持可接受字段为空的情况。但是,如果用户确实输入了内容,它就必须有效。
日期的语法非常灵活。首先,设置Type为Date。然后,MaximumValue和MinimumValue的日期可以输入为YYYY/MM/DD,DD/MM/YY或DD/MM/YYYY。可以去除日和月的前置0。需要一些技巧才可以跨文化集成日期。大多数Web站点不接受本地格式的日期,因为需要具有相关的逻辑来在每种语言中分析它们。更为常见的情况是,需要日期、货币或类似的数据采用服务器文化的格式。条目的格式可以在输入页面上以文本的形式注明。如果尝试全局化(具有许多其他方面而不仅是日期格式的项目),则有3种单独的格式需要考虑:
● RangeValidator属性中的日期语法总是服务器的文化,因此无论文化页指令中的文化是什么,格式都不应该改变。
● RangeValidator在用户键入日期时将接受的语法是文化相关的,并且将受到页指令的文化的影响。
● 数据库自身中日期的存储总是以数据库服务器文化的格式完成。
应用程序全局化是复杂的主题,因为需要考虑许多事情,而不仅是如何配置RangeValidator。在尝试全局化之前,应该学习更多进阶的书籍。RangeValidator控件将检查字符串,并且考虑以Unicode顺序的字母表的范围(Unicode具有与西文字符的ASCII相同的顺序,并且也支持来自于其他语言的字符)。如果希望用户输入是以A到F之间的字母开头的代码,则条目将接受类似于A100,Apple或F999的任何内容。但是,如果输入以小写字母开头的内容,例如a100,验证将失败,因为在Unicode序列中,a列在A和F后面。如果需要将大写或小写字母看作相同字母表的一部分,则使用RegularExpression Validator控件。
可以限制条目为以字母开头的值,其方法是使MinimumValue=A并且Maximum Value=z (注意,小写和大写字母之间的ASCII字符也是可接受的,例如方括号、反斜线和脱字符号)。这可以正常工作,因为在Unicode中,大写英文字母表出现在小写英文字母表之前。如果希望接受字母,例如ñ,ü或_,则需要进一步扩展ASCII顺序中的范围。注意,没有使用逻辑AND的选项;使用RegularExpressionValidator控件可使用该选项。
最后,可以以编程的方式设置范围的最大值和最小值,如同对其他属性所做的那样。例如,可能希望出生日期的MaximumValue为今天,而MinimumValue计算为今天之前的120年。下面的代码将采取一定的技巧,但有两个位置需要注意。首先,确保在RangeValidator中设置数据类型,并且检查在代码中生成的任何值在该类型中是可接受的(特别是日期)。其次,RangeValidator的MaximumValue和MinimumValue属性需要在Page_Load代码执行之前获得一个值。因此,这些属性必须事先具有值,即使它们将在代码中改变:
<%@ Page Language=”VB” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<script runat=”server”>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
RangeValidator1.MaximumValue = DateTime.Today
DOBRangeValidator.MaximumValue = DateTime.Today.AddYears(-21)
Response.Write(RangeValidator1.MinimumValue)
End Sub
</script>
实际上,需要考虑明天的最大值。当夏威夷为1月1日时,在英国的一些人已经进入了1月2日。设置RangeValidator1.MaximumValue=DateTime.Today.AddYears(–21)。
试一试 #3—— 比较和范围验证控件
这个练习将检查合理范围的数字和日期输入。对于日期,将使指示用户小于21岁的日期错误。
(1) 在ch13文件夹中,创建名为TIO-1303-CompareAndRangeValidation.aspx的页面。添加名为HeightTextBox的文本框和要求用户输入身高的标签(以cm为单位)。添加类型为Double的RangeValidator,限制可接受的值为从15到250 cm。
(2) 保存工作并测试它。
(3) 拖动一个文本框至页面,将其命名为DOBTextBox,在其后面放置一个标签,用于呈现“Enter your date of birth”。添加一个简单的RangeValidator以确保用户的输入在1900 (MinimumValue)和2007(MaximumValue)之间。
…<h2>Chapter 13 TIO #1303 Compare And Range Validation version 1</h2>
<form id=”form1″ runat=”server”><div>
<asp:Label ID=”HeightLabel” runat=”server”
Text=”Enter your height in cm” Width=”250px”></asp:Label>
<asp:TextBox ID=”HeightTextBox” runat=”server”
Width=”250px”></asp:TextBox>
<asp:RangeValidator ID=”HeightRangeValidator” runat=”server”
ControlToValidate=”HeightTextBox”
Text=”Your entry for height is less than 15 or more than 250″
MaximumValue=”250″ MinimumValue=”15″
Type=”Double”></asp:RangeValidator><br />
<asp:Label ID=”DOBLabel” runat=”server”
Text=”Enter your Date of Birth”
Width=”250px”></asp:Label>
<asp:TextBox ID=”DOBTextBox” runat=”server” Width=”250px”></asp:TextBox>
<asp:RangeValidator ID=”DOBRangeValidator” runat=”server”
ControlToValidate=”DOBTextBox”
Text=”Your DOB is too early or too recent”
MaximumValue=”12/31/2007″ MinimumValue=”1/1/1900″
Type=”Date”></asp:RangeValidator>
</div></form></body></html>
(4) 保存工作并测试它。
(5) 现在,通过检查某个人小于21岁来改进页面。保存页面为TIO-1303-CompareAnd RangeValidation-2,改变标题和H2文本。在Source视图中,单击左上角的对象列表,然后单击右上角的Load事件,如图13-1所示。
(6) 在最初的过程中输入如下代码,并且将文本属性改为“You must be 21 to buy beer”。
<script runat=”server”>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
DOBRangeValidator.MaximumValue = DateTime.Today.AddYears(-21)
End Sub
</script>
图 13-1
(7) 保存工作,在浏览器中测试它。
(8) 添加名为EMailTextBox1和EMail2TextBox的两个文本框,分别带有一个标签,要求输入电子邮件地址。添加CompareValidator以确认输入的两个电子邮件地址相同。添加两个RequiredFieldValidator以确保用户输入了两个电子邮件地址。
<asp:Label ID=”Email1Label” runat=”server”
Text=”Enter your Email” Width=”250px”></asp:Label>
<asp:TextBox ID=”Email1TextBox” runat=”server”
Width=”250px”></asp:TextBox>
<asp:CompareValidator ID=”EmailCompareValidator” runat=”server”
ControlToCompare=”Email1TextBox”
ControlToValidate=”Email2TextBox”
Text=”Your EMail address entries do not match”>
</asp:CompareValidator><br />
<asp:Label ID=”Email2Label” runat=”server”
Text=”Re-enter your Email address” Width=”250px”></asp:Label>
<asp:TextBox ID=”Email2TextBox” runat=”server”
Width=”250px”></asp:TextBox><br />
<asp:Button ID=”Button1″ runat=”server” Text=”Button” />
(9) 保存工作,在浏览器中测试它。
示例说明 #3—— 比较和范围验证控件
对于高度文本框,只需要考虑人们可能的身高范围。15cm应该包括最小的未成熟婴儿的身高,而250cm将甚至包括篮球运动员的身高。人们可能输入带小数的身高,例如185.5cm。通过将类型设置为Double可容纳这种情况,该类型可支持小数点右边的数字(与Integer相反)。并且,总是和验证控件一样,不要忘记测试ControlToValidate属性。幸运的是,在这个属性中遗漏的值会在运行时引发错误。
人的年龄更为复杂,因为它每天都在改变。在页面中,改为更为复杂的解决方案,即在代码中实际地计算可作为出生日期接受的MaximumValue。下面的代码在验证页面之前运行。与任何其他控件一样,通过其ID在代码中引用验证属性。在一般性的定义中,函数的参数是DateTime=DateTime.AddYears(NumberOfYears)。等号的左边表示类型为DateTime的任何变量或实例,在当前情况下是今天的值,通过运行DateTime.Today方法获得该值(这与旧版本的VB代码相同:DataAdd(KindOfUnitsToAdd, Amount to Add(subtract),Date to which units are added))。总的来说,下面的代码行返回日期,该日期是今天之前的21年:
DOBRangeValidator.MaximumValue = DateTime.Today.AddYears(-21)
对电子邮件地址文本框进行比较验证。确保设置ControlToValidate为期望用户第二次在其中键入内容的输入控件。否则,验证将在第一次接收数据后就激活,而此时第二个验证控件仍然为空。
13.3.5 RegularExpressionValidator控件
正则表达式是字符模式的描述。例如,加拿大邮政编码(示例包括N1K 4R5和B2R 7T8)在字母-数字-字母-空格-数字-字母-数字的模式中总是为6个字符。因为情况总是如此(系统是规则的),可以编写描述该模式的表达式。
注意:
正则表达式可以变得非常复杂,需要编写整本书来介绍该主题(其中可参考Andrew Watt编写的Beginning Regular Expressions,ISBN:0-7645-7489-2)。部分问题是在正则表达式中使用字符来描述值中测试的字符。递归的问题不久就会使您感到万分头疼(查看Douglas Hofstadter编写的Gode,Escher,Bach:An Eternal Golden Braid,ISBN:0465026567)。
正则表达式由两种字符组成:
● 文字字符 描述必须在特定位置中的特定字符。例如,必须总是有一个作为第4个字符的连字符。
● 元字符 描述可允许的字符集(例如,在第2个位置中必须有一个数字)。元字符也包括允许多少字符和如何应用可允许标准的选项。
第一个规则是,如果期望输入在一行中(没有换行符),则在表达式的开始添加一个脱字符号(^),并且在表达式的最后添加一个美元符号$。实际上,这意味着“包括的内容必须在字符串的开始和结束处匹配”。换句话说,不允许匹配这些字符之前或之后的字符。如果使用多行输入,将需要学习这个简短介绍之外的主题。对于初学者,只指定一行是很好的方法。
正则表达式的下一个基本规则是反斜线(\)作为转义字符使用。这意味着反斜线后面的字符可以是以下两种情况之一:真正的元字符或转义的文字字符。例如,如果希望圆括号或句点作为字面值,则必须在其前面添加反斜线。因此,如果值必须是数字2,后面跟上另一个数字,则表达式将是^2\d$。前面的2是文字,表示输入必须在第一个位置中具有字符“2”。然后,反斜线指示表达式中后面的字符d是元字符。元字符d表示任何一个数字(0到9)。类似地,元字符\w表示字符是单词的一部分(字母)。描述加拿大邮政编码(典型的代码是K2V 1A5)的简单正则表达式将是“^\d\w\d \w\d\w$”。注意第一个3字符集和第二个3字符集之间的空格。
如果值中的字符重复,则表达式中该字符的元字符应该在后面跟上一对花括号,其中包括允许重复的确切数量,例如表示5位数字美国邮政编码的^\d{5}$或者表示9位数字美国代码(例如12345-6789)的^\d{5}-\d{4}$。
.NET正则表达式支持接受元字符的可变重复数量的能力。在重复数字圆括号中添加一个逗号可指示数字是最小值。逗号后的第二个数字指示最大值。因此,确切的5个数字表示为^\d{5}$,5个或更多数字表示为^\d{5, }$,任何数量的数字表示为^\d{0, }$,数字的数量至少为3但不多于5可表示为^\d{3,5}$。
也存在使用通配符的多个字符的语法。后面跟上星号*的元字符可重复0次或多次,这与{0,}相同。后面跟上加号+的元字符必须重复一次或多次(至少一次),这与{1,}相同。元字符后面跟上问号表示字符重复0次或一次,这与{0,1}相同。例如,可以只有数字、必须至少有一个数字并且对数字的长度没有上限,这种输入可描述为^\d+$。
可以在一个位置中展示可允许字符的列表。该列表只需要包括在方括号[]中,并且每项之间用逗号分隔。例如,可能有一种密码方案(非常弱的密码),它需要一种3个字母的密码,其中中间的字母必须是元音。用于验证的正则表达式是^\w[a, e, i, o, u, A, E, I, O, U]\w$。这允许cat,CAT和dog,但不允许adz。
正则表达式支持许多特殊的字符,例如制表符、换行符等。一种较大的作用域是\s,它包括任何类型的空白(空格或制表符)。
和代数中一样,正则表达式也允许使用圆括号。对于OR运算符,这一点特别有用,例如在产品代码可能输入为12-345或12 345的模式中:
^\d{2}(\-|\s)\d{3}$
作为总结,表13-2描述了一些常见的正则表达式。
表 13-2
目 的 |
正则表达式 |
注 释 |
简单电子邮件地址 (然而,这个简单的电子邮件地址不能容纳域名中的数字,例如IP地址。查看下面的介绍以获得更好的替代方法) |
^\w+@[a-z A-Z_]+? \.[a-z A-Z]{2,3}$ |
\w+:任何数量的字母 @:字面值 [a-z A-Z_]+?:任何数量的字母 \.:字面值句点(.) [a-z A-Z]{2,3}:两个或3个字母 |
10位数字的电话号码 (918)123-4567 918 123-4567 |
\(?\d{3}[) ]\s?\d{3}[- ]\d{4})$ |
\(?:匹配0个或一个左边的圆括号 \d{3}:确切地匹配3个数字 [) ]:检查右边的圆括号或空格 \s?:检查0个或一个空格 |
5位或9位数字的美国邮政 编码 |
\b\d{5}-\d{4}\b|\b\d{5}\b |
\d{5}-\d{4}:匹配加上4位的多个现代邮政编码 |:替换模式的OR运算 \d{5}:匹配只有5位数字的原有模式 |
上面的电子邮件地址条目将不会接受由数字组成的IP地址。在这里将讨论这个问题,首先从整个表达式开始介绍:
([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zAZ]{
2,4}|[0-9]{1,3})(\)?)
可以将这个表达式分解为如下部分。首先,允许在电子邮件地址的个人部分中有任何数量的字符,后面跟上字面值@符号。这就容纳类似于Joe@…或Joe.Doe@…的格式。注意圆括号如何将加号应用于字母和句点。
([\w-\.]+)@
接下来,需要接受数字的IP地址或域名。因此,将建立OR结构,下面的阴影行指示了该结构。下面的第一行是示意内容,第二行是实际的表达式:
( …option A… )|( …option b… )
((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+)]
在上面的代码中,选项A匹配具有3组最多3个数字的IP地址,每组由一个句点符号分隔。句点本身表示“任何一个字符”。反斜线和后面跟着的句点表示字面值句点。
((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.]
选项B用于域名,通过允许后跟句点的任何数量的字母来表示。
[\w-]+\.
但是,地址可能有域的多个部分,形式为Joe@NorthRegion.Sales.USA.MyCompany.com。因此,采用上面的模式,使用圆括号包括它们,并且允许根据需要重复。
(([\w-]+\.)+))
最后一位是最后一个句点的右边。它可以是字母(例如.com或.org)或IP地址中的数字,因此,处理方法与上面相同,同样使用两个选项。第一个选项是2到4个字母,而第二个选项是1到3个数字。同样包括在数字选项中的内容是圆括号和反斜线字符。最后一个问号表示可以有一个或多个这两个选项。
( LetterOption| NumberOption )
([a-zA-Z]{2,4}|[0-9]{1,3})(\)?)
前面提及,关于正则表达式的艺术和科学的介绍可能需要编写整本书。但是,在本书中将只介绍一些示例。
试一试 #4—— RegularExpressionValidator控件
这个练习将为美国的社会安全号创建验证。数字的形式总是123-45-6789,但是希望接受人们使用空格输入社会安全号(123 45 6789)而不是使用连字符输入,或者是接受完全没有分隔的字符(123456789)。
(1) 在ch13文件夹中,创建名为TIO-1304-RegularExpression-1.aspx的页面,并且添加具有文本“Please enter a social security number”的标签、一个文本框、一个按钮和一个RegularExpressionValidator控件。设置ControlToValidate为TextBox1,设置Text属性为“Invalid Social Security Number”。输入基本的ValidationExpression,如下所示:
^\d{3}-\d{2}-\d{4}$
(2) 保存页面,在浏览器中测试它。
(3) 添加接受没有空格的能力,方法是将验证表达式改为如下:
^(\d{3}-\d{2}-\d{4})|(\d{9})$
(4) 保存页面为TIO-1304-RegularExpression-2.aspx,在浏览器中测试它。
(5) 最后,添加如下可能性:输入带有空格而不是连字符的数字,如下所示:
^(\d{3}-\d{2}-\d{4})|(\d{9})|(\d{3} \d{2} \d{4})$
(6) 保存页面为TIO-1304-RegularExpression-3.aspx,在浏览器中测试它。
示例说明 #4—— RegularExpressionValidator控件
注意,整个ValidationExpression在^和$之间,用于表示整行的输入。当使用反斜线时,表示后面的字符将是元字符,而不是字面值。在第一种情况中,使用\d表示0到9之间的任何数字。花括号指示可以使用字符多少次,这在左边的部分中是3次。然后在后面跟上一个连字符。因为连字符前面没有反斜线,它表示这是一个字面值的连字符。
当添加替换格式时,将整个格式包括在圆括号中,然后使用垂直线字符将其与替换格式分开,垂直线字符表示OR。虽然在这种特定的情况中不一定要使用圆括号,但使用它可使人们更容易阅读代码。
13.3.6 CustomValidator控件
这个控件引发称为ServerValidate的事件,可以使用该事件执行实际的测试。输入值将作为ServerValidateEventArgs.Value传递给过程。可以设置一个Boolean值,表示ServerValidate- EventArgs.IsValid中过程的结果。如果设置该属性为false,CustomValidator将像任何其他验证控件一样对输入测试失败的情况进行相应操作。
在事件处理程序的实现中,应该引用ServerValidateEventArgs.Value属性而不是直接引用控件。这就可以对多个具有潜在不同的ControlToValidate设置的CustomValidator共享相同的事件处理程序。
作为示例,将假设使用内置模式发布验证代码。典型的代码是A65,M77或Z90,其中数字表示前面字母的ASCII值。可以执行自定义的验证。注意,CustomValidator控件具有称为ServerValidate的事件,该事件调用称为CustomValidator1_ServerValidate的过程。该过程然后具有一个功能行,用于设置ServerValidateEventArgs.IsValue为true或false,并将其返回给验证控件。测试表达式比较左边字符(字母)的ASCII值与右边两个数字。
<script runat=”server”>
Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal
args As System.Web.UI.WebControls.ServerValidateEventArgs)
‘ a few lines of diagnostic information for learning
Response.Write(“left” & Left(args.Value, 1) & “<br/>”)
Response.Write(“ASCleft” & Asc(Left(args.Value, 1)) & “<br/>”)
Response.Write(“right” & Right(args.Value, 2) & “<br/>”)
‘ the actual test
args.IsValid = (Asc(Left(args.Value, 1)) = Right(args.Value, 2))
End Sub
</script>
<h2>Chapter 13 Demo #1301 Custom Validation Control</h2>
<form id=”form1″ runat=”server”>
<div>
Please enter your authorization code*<br />
<asp:TextBox ID=”TextBox1″ runat=”server”></asp:TextBox>
<asp:Button ID=”Button1″ runat=”server” Text=”Button” /><br />
<asp:CustomValidator ID=”CustomValidator1″ runat=”server”
ErrorMessage=”Authorization code is not valid.”
ControlToValidate=”TextBox1″
OnServerValidate=”CustomValidator1_ServerValidate”>
</asp:CustomValidator><br /><br />
*(try A65 or M77 or Z90)
</div></form></body></html>
将在下一个练习中尝试实现自定义的验证控件。
试一试 #5—— CustomValidator
这个练习将表示连接专业社团的部分形式。大多数成员都有一个Professional状态。但是25岁以下的成员可以是Students,而65岁以上的成员可以是Emeritus。将要求用户输入出生日期,并且选择会员资格类型。然后页面将使用自定义验证控件检查它们的会员资格类型。
(1) 在ch13文件夹中,创建称为TIO-1305-CustomValidator.aspx的新页面。添加具有文本“Please enter your date of birth”的标签。添加一个文本框,然后添加RequiredField- Validator和CompareValidator控件,用于检查输入项是否是日期(ControlToValidate= TextBox1,Operator=DataTypeCheck,Type=Date)。
(2) 添加RadioButtonList,在Smart Tasks面板的编辑项中,添加3项(文本/值):Student/S,Professional/P和Emeritus/E。
(3) 添加一个按钮和一个自定义控件。在Source视图中,在左上角的对象列表中选择CustomValidator,在右上角的事件列表中选择ServerValidate。在过程中输入如下代码行:
<script runat=”server”>
Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal
args As System.Web.UI.WebControls.ServerValidateEventArgs)
‘ must be under age 25 to get a student membership
If RadioButtonList1.SelectedValue = “S” And _
CDate(DobTextBox.Text) < DateAdd(“yyyy”, -25, Today()) _
Then args.IsValid = False
‘ must be over 65 to get an emeritus membership
If RadioButtonList1.SelectedValue = “E” And _
CDate(DobTextBox.Text) > DateAdd(“yyyy”, -65, Today()) _
Then args.IsValid = False
End Sub
</script>
<h2>Chapter 13 TIO #1305 Custom Validator </h2>
<form id=”form1″ runat=”server”>
<div>
Membership Application<br /><br />
Students members must be under age 25.<br />
Emeritus members must be over age 65. <br /><br />
<asp:Label ID=”Label1″ runat=”server”
Text=”Please enter your date of birth as mm/dd/yy “></asp:Label>
<asp:TextBox ID=”DobTextBox” runat=”server”></asp:TextBox>
<asp:RequiredFieldValidator ID=”RequiredFieldValidator1″
runat=”server”
ControlToValidate=”DobTextBox”
Text=”Please enter your date of birth”>
</asp:RequiredFieldValidator>
<asp:CompareValidator ID=”CompareValidator1″ runat=”server”
Text=”CompareValidator”
ControlToValidate=”DobTextBox”
Operator=”DataTypeCheck”
Type=”Date”>
</asp:CompareValidator><br />
<asp:RadioButtonList ID=”RadioButtonList1″ runat=”server”>
<asp:ListItem Value=”S”>Student</asp:ListItem>
<asp:ListItem Value=”P” Selected=true >Professional</asp:ListItem>
<asp:ListItem Value=”E”>Emeritus</asp:ListItem>
</asp:RadioButtonList><br />
<asp:Button ID=”Button1″ runat=”server” Text=”Button” />
<asp:CustomValidator ID=”CustomValidator1″ runat=”server”
Text=”Your membership selection is not appropriate for your age”
OnServerValidate=”CustomValidator1_ServerValidate”>
</asp:CustomValidator>
</div></form></body></html>
(4) 保存页面并在浏览器中测试。
示例说明 #5—— CustomValidator
添加了一个自定义控件,当服务器执行它的验证时(ServerValidate事件)调用该控件。不需要使用传递到自定义过程中的任何值;可以直接引用输入控件。因为测试将涉及日期,需要确保文本框中存在日期,并且输入的值确实是日期。
注意由CustomValidator调用的过程。下面有一个简单的If-Then子句,用于在两个条件都满足时设置args.IsValid为false。第一个条件是单选按钮列表中的选择是S。第二个条件是输入的日期是否早于今天之前的25年。DateAdd函数具有3个参数。第一个参数是加或减的单位类型,YYYY表示年。第二个参数是加或减的单位数量。第三个参数是开始加法的日期;在这种情况下,这是由Today()函数返回的当前日期。
‘ must be under age 25 to get a student membership
If RadioButtonList1.SelectedValue = “S” And _
CDate(DobTextBox.Text) < DateAdd(“yyyy”, -25, Today()) _
Then args.IsValid = False
重复上述操作以测试退休状态的申请者的出生日期小于(早于)今天之前的65年:
‘ must be over 65 to get an emeritus membership
If RadioButtonList1.SelectedValue = “E” And _
CDate(DobTextBox.Text) > DateAdd(“yyyy”, -65, Today()) _
Then args.IsValid = False
End Sub
</script>
转载于:https://www.cnblogs.com/cwy173/archive/2009/12/28/1633749.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158231.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...