十八岁真好,可惜我们再也回不去了

13.3  验证控件的项目

到近日甘休,已经探讨了求证的相干理论。ASP.NET
2.0提供了5种注脚控件,表13-1对此开展了描述。然后,将介绍每种控件的底细,首先是表格式概述。

图片 1

13.3.1  类型表

表  13-1

控  件  名

适 用 情 况

RequiredFieldValidator

为了避免空值,例如当用户输入密码以建立新账户时

RangeValidator

为了检查输入的值是否在限制的范围内。例如,对于青年俱乐部,出生日期字段应该指示年龄小于18岁

CompareValidator

为了检查两个字段是否包含相同的值。例如,当创建密码时,用户应该输入密码两次以确保用户正确记住它

RegularExpressionValidator

为了检查输入是否匹配关于字符性质的模式,例如字母与数字、大写字母与小写字母、日期的长度和有效性

CustomValidator

为了检查输入符合以代码编写的规则。这可以包括复杂的评估,例如检验授权号中的模式

常青最宜人之处,在于他的一弹指间即逝,在于她的没有。

13.3.2  RequiredFieldValidator控件

在前方的示范中来看过,RequiredFieldValidator控件检查输入不为空。就像在大部分数据库工作中平等,一个或多个空格将一如既往被认为是一个值。同样,数据源控件或数据库可能拉长一个默许值,而Required菲尔德Validator不会考虑那种景况。

当使用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字符串在服务器上转换为空值。

2018年1月3日  星期三  大雾

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被设置为Date提姆e。

注意:

要是无意中同时包含了ControlToCompare和ValueToCompare属性,则选择ControlToCompare。

文|深海梦影

13.3.4  RangeValidator控件

RangeValidator控件确保输入值在上界和下界之中。验证的输入值可以是数字、货币、日期或(很少的景观)字符串。除了上面琢磨的常见属性,有3个测试属性需求安装:MinimumValue,马克斯imumValue和Type,Type表示数据类型。上界值和下界值包括在内,因此比较相近于>=和<=。假如它们的特性分别被装置为5和10,则输入5和10是可接受的。借使将接受所有小数值的数字,则选拔Double类型。

RangeValidator控件也有违背的景色。如果输入控件中绝非数据存在,则RangeValidator控件将不会阐明输入,并且不会抛出注脚战败。为了有限辅助所有输入值,并且该值在界定内,则必须添加第四个声明控件:RequiredFieldValidator。那种规划支撑可接受字段为空的情形。可是,假如用户真正输入了内容,它就亟须有效。

日子的语法极度灵活。首先,设置Type为Date。然后,马克斯imumValue和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并且马克斯imum
Value=z
(注意,小写和大写字母之间的ASCII字符也是可接受的,例如方括号、反斜线和脱字符号)。那足以健康工作,因为在Unicode中,大写英文字母表出现在小写英文字母表往日。如果指望接受字母,例如ñ,ü或_,则要求进一步伸张ASCII顺序中的范围。注意,没有选用逻辑AND的选项;使用RegularExpressionValidator控件可选用该选项。

最后,可以以编程的办法设置限定的最大值和纤维值,就如对别的属性所做的那样。例如,可能希望出生日期的马克斯imumValue为今天,而MinimumValue计算为今天事先的120年。下边的代码将动用一定的技艺,但有五个义务必要注意。首先,确保在RangeValidator中设置数据类型,并且检查在代码中生成的别样值在该项目中是可接受的(更加是日期)。其次,RangeValidator的马克斯imumValue和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"&gt;

<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日时,在United Kingdom的有些人早就进来了十一月2日。设置RangeValidator1.马克斯imumValue=Date提姆e.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(马克斯imumValue)之间。

…<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>

图片 2

图  13-1

(7) 保存工作,在浏览器中测试它。

(8)
添加名为EMailTextBox1和EMail2TextBox的五个文本框,分别包蕴一个标签,需要输入电子邮件地址。添加CompareValidator以确认输入的八个电子邮件地址相同。添加八个Required菲尔德Validator以有限支撑用户输入了七个电子邮件地址。

<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属性。幸运的是,在这一个特性中遗漏的值会在运转时引发错误。

人的年纪越来越复杂,因为它每一日都在转移。在页面中,改为尤其复杂的解决方案,即在代码中实际野山参打细算可看成出生日期接受的马克斯imumValue。上边的代码在验证页面之前运行。与别的其余控件一样,通过其ID在代码中引用验证属性。在常常的概念中,函数的参数是DateTime=Date提姆e.AddYears(NumberOfYears)。等号的左边表示项目为Date提姆e的其余变量或实例,在当前情状下是昨日的值,通过运行DateTime.Today方法取得该值(那与旧版本的VB代码相同:DataAdd(KindOfUnitsToAdd,
Amount to Add(subtract),Date to which units are
added))。总的来说,下边的代码行再次回到日期,该日期是前些天事先的21年:

DOBRangeValidator.MaximumValue = DateTime.Today.AddYears(-21)

对电子邮件地址文本框进行相比印证。确保设置ControlToValidate为梦想用户第二次在里面键入内容的输入控件。否则,验证将在第一遍接收数据后就激活,而那时候首个验证控件照旧为空。

18年的率先篇作品,记录一下18岁那年吧。

13.3.5  RegularExpressionValidator控件

正则表明式是字符格局的讲述。例如,加拿大邮编(示例包蕴N1K 4R5和B2R
7T8)在字母-数字-字母-空格-数字-字母-数字的方式中接二连三为6个字符。因为状态总是这么(系统是平整的),可以编制描述该格局的表明式。

注意:

正则表明式可以变得至极复杂,须要编制整本书来介绍该主旨(其中可参考Andrew沃特t编写的Beginning Regular
Expressions
,ISBN:0-7645-7489-2)。部分难题是在正则表明式中行使字符来叙述值中测试的字符。递归的标题及早就会使你觉得卓殊头疼(查看道格拉斯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

目    的

正则表达式

注    释

简单电子邮件地址

Joe@Does.org

(然而,这个简单的电子邮件地址不能容纳域名中的数字,例如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@诺思Region.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。纵然在那种特定的动静中不自然要动用圆括号,但利用它可使人们更便于阅读代码。

-1-

当最终一波九零后跨入成年,九五后的老三伯老小姑们抓住一股牵挂十八岁的狂潮。

如同如此就不算辜负那段时光,如同如此就可以把年轻留住。

久远湛蓝的苍天,带有后座的自行车,穿着白裙的马尾女孩,体育馆上挥汗如雨的妙龄都成了年轻的代名词。

那儿,我看向窗外的苍穹,不再如当场那样澄澈。回看着三年前那么些云淡风轻的光景,又大胆说不出的痛感。

十八岁那年的明天,天气好呢?是风,是雪,亦可能晴?天空又是怎样颜色?

本身正钻在书堆里狂刷五三,还是在和蟑螂斗智斗勇,或者在跟同桌偷偷分着面包?

自己暗恋的少年今日有没有经过门前?说欣赏自己的男孩是或不是进入我的视线后又三遍逃远?

本人是或不是四回头就观察班主管贴在后门的脸?他拿走了何人藏在桌斗的小说,又收走了哪个人的mp4?

回看起这个画面,有种很不忠实的痛感。就像近在前几天,又像是过去了过多年。

13.3.6  CustomValidator控件

本条控件引发称为ServerValidate的风浪,可以运用该事件实施实际的测试。输入值将作为ServerValidate伊夫ntArgs.Value传递给进度。可以设置一个Boolean值,表示ServerValidate-
伊芙ntArgs.IsValid中经过的结果。假若设置该属性为false,CustomValidator将像其余其余表明控件一样对输入测试战败的气象开展对应操作。

在事件处理程序的贯彻中,应该引用ServerValidate伊夫ntArgs.Value属性而不是一向引用控件。那就足以对多少个拥有潜在差别的ControlToValidate设置的CustomValidator共享相同的事件处理程序。

用作示范,将假如使用内置形式发表说元朝码。典型的代码是A65,M77或Z90,其中数字代表前面字母的ASCII值。可以举办自定义的证实。注意,CustomValidator控件具有称为ServerValidate的轩然大波,该事件调用称为CustomValidator1_ServerValidate的进程。该进程然后所有一个效应行,用于安装ServerValidate伊夫ntArgs.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>

-2-

我的十八岁,平凡而不干燥。

那年,某个冬夜,大家相见有史以来最狂的一场风。坐在教室里,窗外风撞击着玻璃,发出嗖嗖的音响。

末尾,我们眼睁睁瞧着玻璃窗哗哗碎了一地,穿着单薄的校服,多少个好友在边际抱团取暖。

那年,某个黄昏,我们正在体育场所狂刷数学题,突然地震。有同学高兴地喊,日常的地震演习没白练,终于等来这一天。

那天早晨,全体同学在食堂度过亢奋的一夜,我们瞳孔里披露着惶恐,却在口口声声祈祷,让地震来得再激烈些吧,争取让教学楼化为废墟。

那年,所有老师都有绰号。班总裁肤色很黑,有人叫她黑狗。生物教授是老六的老爹,外号六爹。高一化学听不懂,给教授起外号Moore,一叫就是三年。

那年,大家喜爱学老师说话。数学老师的新疆话,极有感染力。班老董的口头禅被大家复述了不少遍。

那年,大家可爱的语文先生可以精晓地数出班上每一对仇人。点名提问,情侣总是被放在一起,引来一波又一波轰动。

那年,班老董最爱说的一句话,”一天天的,你们干什么吃的”,那句话有趣又有力,趴在课桌上的校友总会须臾间弹起。

那年,我们最喜爱上体育课。坐在操场旁边的老槐树下,看男生在训练场中校篮球举过头顶,球在空中留下一抹若隐若现的弧度。

那年,大家公共换上班服。豆青色,多么英姿勃勃的颜料,多么青春的颜料。

那年,大家最愿意放假前夜。多个人挤在两张床上,分享着各自的小秘密,何人喜欢上了什么人,谁身上有好闻的烟草味。

那年,我以朋友的名义暗恋过一个男孩。说不出他哪儿好,就连吊儿郎当的规范也百看不厌。在闺蜜眼里,那样的自身是个笑话。

本以为大家之间不会有故事,没悟出在本人生日那天她对自己表白,我瞒着所有人激动了一整晚,却未曾答应跟她在一道。

那年,我有多少个万分要好的心上人。男生教我们女人打英雄联盟,我最喜爱阿Carrie。大家一并跑出去吃路边摊,一起在自习课上背后分喝一桶饮料,在桌子底下碰杯。在最痛心的时候相互打劲,在您得意的时候告诫你绝不忘形。

那年,身后总有多少个让你狼狈的男生。在您昏昏欲睡的时候砸你一拳,在你讲解回答不出难点的时候默念答案,在您睡着的时候偷吃你的零食,又”完好无损地”放在桌前。

那年,我们思想单纯。女人之间很简单争风吃醋,又很简单和好如初,不过是因为你后天看见自己没来得及打招呼,却忙着跟别人聊得生机盎然。

那年,大家去何地都不会是一个人。上洗手间必须手拉开首,不精通为何有人会一个人吃饭,一个人逛街,一个人看视频。

那年华诞,真的很打动。下课后被带进办公室整理作业,回班后才发现有人偷偷买了蛋糕,有人点了火炬。四张桌子,七个人,关掉灯就是一阵一气浑成的狂欢。

那年,当课代表真的烦。老师总有赶不出的告知让你胡乱一填,总有那么多少个大费周章也做不出题的同校拖欠作业,总会因为班级单科平均分上不去而焦急难安。

那年,有幸被教授推选去参与数学比赛。坐了多个钟头的夜车,迷迷糊糊地走进考场。当自身捧起全国三等奖的证件,双手是颤抖着的。

那年,大家并未过多生活费,手机也从不流量。大家会在上午用一毛钱发一条很长很长的短信,把持有想说的话写进同一条短信里,又希看着一条长达回复。

那年,食堂的饭菜真的很难吃。最后一顿午餐,听到有人说,”会不会难熬,未来再也不会吃到这么难吃的菜了”。

那年,夏季很冷。早上洗了的头发秒冻成冰,当手漫过水管流出的水,又火辣辣地痛。

那年,我们每个人眼前都有一个大箱子,里面堆满了各类复习资料参考书试卷,桌前摞起的书丰富隐蔽视线。

那年,我们总有刷不完的题,总有看不懂的答案。钻在题英里,跟王后雄进行了一场长时间的心机交谈。

曾经真的觉得那就是最难过的日子,一边憧憬着老师眼里的大学,一边抱怨着时间怎么过得那样慢。

那年,舍友挑灯夜读到很晚,早上递来的麻酱凉皮很好吃,我经常趴在小台灯下,面对着千家万户的字发呆,心里想着她们哪些时候才关灯睡去。

总以为,将操练摆在眼前,就会心安理得。

那年,黑板上距高考的倒计时如同敲响的警钟,班上张贴的横幅颜色很花哨,上边的白字很刺眼。

那年,高考前夕某个晚上,高校进了贼。偷走一些杂乱无章的事物,很多校友的身份证丢失,就连我留下蟑螂的半个面包也泯灭不见。监控里浮现的,性别不明,全副武装的覆盖青年。

那年,大家走过整个高校拍结业照。将笑脸定格在更加炎热的春季,高校里每个角落都不乐意失去,却遗憾没能拍到风谲云诡的云彩和映红半边天的晚霞。

那年,高考铃声一响,最终一科终止,也在文告着青春年少的终止。窗外下起小雨,大家都不曾打伞。只因听到有人说,伞的谐音是散。

我驾驭见到有些人欢呼着终究翻身,有的人在雨里哭成狗,很为难。

那年,结业晚会。有同学说,”有些话再不说,一辈子都未曾机会了”,有稍许人抓住最后一根稻草,给心仪的女子表白。

那年,那天,我们的确结业了。有同学说,这辈子那群人怕是再也集不齐了。因为一句话,又哭红多少双眼。

那年,真的很美好。

本身不敢说自己的十八岁是人生中最美好的时节,毋庸置疑,这一个日子是无限尊敬的。

-3-

三年又过去了,再次翻出十八岁那年的肖像,天空是碧蓝的,笑容是青涩的。

咱俩眼神里流露着唯有,手挽早先,穿着不合身的校服,素面朝天,如花笑魇。

当下陪您共同度过高考战场的人,后来还有联系吗?

那会儿说仰慕你的女孩子,现在还喜爱您啊?

当初费尽心绪苦苦追求你的妙龄,近来又陪同在了哪个人的身边?

被框在同样张照片里的这厮儿啊,是哪个人说过我们平昔一贯不分离,又是哪个人曾在雪地里唱青春荒唐我不负你。

最终,你会发现,洋洋事并将来日方长,很三个人只会乍然离场。

有些人,转眼就散落人海,从此失去联络。高校里,很难再蒙受那样一群人了。越来越多天天,是祥和熬过了拥有。

十八岁那年,时光真的很美好,也很短暂。

全校一向伫立在老地点,迎来送往,安然无恙。而我辈,在踏出校门的那一刻,意味着再也回不去了。

假定时光能够倒流,我愿意回到十八岁。

  End.

「无戒365天极限挑衅日更营第60天」