篮球十八岁真好,可惜大家再也回不去了

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控件检查输入不为空。就像是在大部数据库工作中相同,一个或七个空格将依然被认为是一个值。同样,数据源控件或数据库可能抬高一个默许值,而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字符串在服务器上更换为空值。

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。然后,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并且马克斯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日时,在大不列颠及北爱尔兰联合王国的一部分人一度进来了四月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以确认输入的几个电子邮件地址相同。添加多个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属性。幸运的是,在那个特性中遗漏的值会在运作时引发错误。

人的岁数越来越复杂,因为它每一天都在转移。在页面中,改为越发复杂的化解方案,即在代码中实际上地测算可视作出生日期接受的马克斯imumValue。下边的代码在注解页面以前运行。与别的其余控件一样,通过其ID在代码中引用验证属性。在日常的定义中,函数的参数是Date提姆e=Date提姆e.AddYears(NumberOfYears)。等号的左手表示项目为Date提姆e的别的变量或实例,在当前意况下是后天的值,通过运行Date提姆e.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)。部分难点是在正则表明式中应用字符来叙述值中测试的字符。递归的标题及早就会使你觉得极度胃痛(查看DouglasHofstadter编写的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天」