|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。创立|控件导言
在壮大的.NET眼前,我有良多的设法,我但愿asp.net的web控件内建有考证功效,而不必要在页面中拔出太多的考证控件乃至代码凌乱!如今我们将能够使用.NET来创立一个只同意输出整型数字的的textbox控件或只同意输出泉币型数据的textbox控件,等等。固然了,你还能够出格指定textbox控件能否为空大概是不是在一个局限内,等等,别的,当我们输出的数据切合请求时,还能够前往一个值,以便利我们以为是不是要干涉,乃至我们可让它运转的时分依据输出数据是不是切合请求出现分歧的色彩
经由一番勉力,我终究完成以上的设法
完成IValidator接口
我在研究SDK文档时发明,只需完成了IValidator接口,任何的控件都能够具有考证功效,以下是一个承继textbox控件的复杂的例子:
usingSystem;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI;
namespaceMyValidatingControls{
publicclassTextBox:System.Web.UI.WebControls.TextBox,IValidator{
privatebool_valid=true;
privatestring_errorMessage="";
publicboolIsValid{
get{return_valid;}
set{_valid=value;}
}
publicstringErrorMessage{
get{return_errorMessage;}
set{_errorMessage=value;}
}
publicvoidValidate(){
}
}
}
固然了,这段程序甚么都不做,可是它完整完成了基础的IValidator接口的架构(最少它是能够乐成编译的),我利用Private关头字创立两个字段(field)用来保留考证形态和毛病信息,为了确保考证控件能被实行,我们必需把我们的考证控件增加到页面中的考证控件汇合中来。
我在浏览SDK文档的时分发明,考证控件是在初始化时代加载他们自己的,IValidators接口次要用来注册他们本人,以是我们必要利用掩盖的办法从头完成OnInit和OnUnload事务,以便我们能从页面中的考证控件汇合中增加大概删除它们
protectedoverridevoidOnInit(EventArgse){
base.OnInit(e);
Page.Validators.Add(this);
}
protectedoverridevoidOnUnload(EventArgse){
if(Page!=null){
Page.Validators.Remove(this);
}
base.OnUnload(e);
}
完成设置
在我们完成我们的考证功效之前,为了使事务更简便,我设置了一些匡助项目,由于我不想独自分离独自供应考证控件的毛病信息,而是但愿把他们嵌进到控件中来,以完成我们所希冀格局的数据录进,因而,我必要做一些事变,使它能够得当的呈现毛病提醒。
我将增加一个叫做FriendlyName属性,它将在一切的毛病提醒信息中呈现以提醒用户正当的数据范例,以是,假如我们挪用的控件ID是RetailPrice,我们将使该控件的riendlyName为RetailPrice
privatestring_friendlyName="";
publicstringFriendlyName{
get{return_friendlyName;}
set{_friendlyName=value;}
}
最初,我们重写IsValid事务,使它能够在考证欠亨过期能够改动控件的背景色彩
publicboolIsValid{
get{return_valid;}
set{
_valid=value;
if(!_valid){
this.BackColor=Color.LightCoral;
}
else{
this.BackColor=Color.White;
}
}
}
不同意呈现空格
起首我们必要断定,供应一个可选项以决意是不是同意为空值,我们在这里必要创立一个属性以判别是不是能够为空
privatebool_blankAllowed=true;
publicboolAllowBlank{
get{return_blankAllowed;}
set{_blankAllowed=value;}
}
最初,我们能够重写考证函数
publicvirtualvoidValidate(){
this.IsValid=true;
if(!this.AllowBlank){
boolisBlank=(this.Text.Trim()=="");
if(isBlank){
this.ErrorMessage=
String.Format("{0}cannotbeblank.",
this.FriendlyName);
this.IsValid=false;
}
}
}
拓展我们的创意
如今我们已创立了一个内建基础考证功效的textbox控件,如今我们能够延展我们的设法,创立更多的风趣的具有特定考证功效的textbox控件
上面以创立一个只同意输出整型数据的textbox控件(IntegerTextBox),而且使该控件具有只同意输出的数据必需在必定的局限内,但我们仍旧必要思索是不是同意空值,以是,象下面一样,必要增加一个属性
在下面我们创立的基础的textbox控件的基本上,我们仅仅必要承继该控件,然后掩盖Validate函数和增加一些新的属性
privateint_minValue=Int32.MinValue;
privateint_maxValue=Int32.MaxValue;
publicintMinValue{
get{return_minValue;}
set{
_minValue=value;
if(_minValue>_maxValue){
intswap=_minValue;
_minValue=_maxValue;
_maxValue=swap;
}
}
}
publicintMaxValue{
get{return_maxValue;}
set{
_maxValue=value;
if(_minValue>_maxValue){
intswap=_minValue;
_minValue=_maxValue;
_maxValue=swap;
}
}
}
然后,我们扩大该Validate函数,并把编译它为当地代码
publicoverridevoidValidate(){
this.IsValid=true;
boolisBlank=(this.Text.Trim()=="");
if(isBlank){
if(!AllowBlank){
this.ErrorMessage=String.Format("{0}"+
"cannotbeblank.",this.FriendlyName);
this.IsValid=false;
}
}else{
try{
_value=Int32.Parse(this.Text);
if(_value<this.MinValue){
this.ErrorMessage=String.Format("{0}cannot"+
"belessthan{1}",
this.FriendlyName,this.MinValue);
this.IsValid=false;
}
if(_value>this.MaxValue){
this.ErrorMessage=String.Format("{0}"+
"cannotbemorethan{1}",
this.FriendlyName,this.MinValue);
this.IsValid=false;
}
}catch{
this.ErrorMessage=String.Format("{0}"+
"isnotavalidinteger.",this.FriendlyName);
this.IsValid=false;
}
}
}
publicintValue{
get{return_value;}
set{
_value=value;
this.Text=_value.ToString();
}
}
结论
要写就那末多了,如今我们还能够在这个类的基本上创立诸如请求只能输出切合必定工夫格局和泉币格局,上面我们举一个例子以申明怎样利用我们创立的控件
在此之前我们要完成一样的功效必要写以下的代码:
<asp:TextBoxid="Number"runat="server"/>
<asp:RequiredFieldValidatorid="RequiredFieldValidator2"
ControlToValidate="Number"
Text="Numbercannotbeblank."runat="server"/>
<asp:RangeValidatorid="Range1"ControlToValidate="Number"
MinimumValue="0"MaximumValue="100"
Type="Integer"Text="Thevaluemustbefrom0to100!"
runat="server"/>
而如今,我们仅仅需一句:
MyControls:IntegerTextid="Number"
FriendlyName="Number"MinValue="0"MaxValue="100"
AllowBlank="false"runat="server">
最初,必要申明的是,我创立的这个类绝对与现有的考证来讲其实不那末完善,一个分明必要改善中央是,我们必要在该类中增加客户端剧本,以使考证举动能够不但在服务器端触发,也能够在客户端触发
我但愿每个人都能了解它的运转道理,以便你有更好的创意的时分能够修改它,大概有一天我大概会利用你创立的具有完善功效的类集。
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解) |
|