愤怒的大鸟 发表于 2015-1-16 22:45:25

ASP.NET网站制作之ASP.NET 2.0服务器控件之考证控件示例

听03很多师兄说主讲老师杭城方讲课很差就连旁听也没有去了)asp.net|服务器|控件|示例  在上一篇文章中,我们解说了有关完成考证控件的一些常识。那些内容将为开辟职员完成考证控件奠基必定基本。为了匡助读者更好的了解考证控件的完成办法,本文将起首先容罕见考证控件的完成步骤,然后,经由过程一个典范示例申明考证控件的完成办法。

  1.考证控件完成步骤

  在创立考证控件过程当中,必要完成服务器端考证和客户端考证等中心内容。上面枚举了考证控件的罕见完成步骤。

  (1)考证控件类应由BaseValidator基类承继。如许可以使考证控件主动承继介入考证框架所必要的功效。比方,经由过程承继BaseValidator的ControlToValidate属性,完成考证控件与考证方针控件的联系关系。

  (2)完成考证控件所独有的一些属性。开辟职员可依据使用需求,从便利有用的角度动身界说这些特有属性。

  (3)重写AddAttributesToRender办法,将特有属性及相干内容增加到控件出现中。当完成客户端考证代码时大概必要援用相干出现内容。

  (4)重写EvaluateIsValid办法,为考证控件增加服务器端考证逻辑。

  (5)重写PreRender事务的事务处置办法OnPreRender,除挪用基类完成办法外,还要完成对客户端考证剧本文件的注册。

  (6)编写与考证控件一同打包的客户端考证剧本文件,而且将其安排到准确的目次中。

  经由过程以上的一个大概几个步骤,开辟职员就能够完成一个基础的考证控件。在完成过程当中,服务器端考证逻辑和客户端考证逻辑必需坚持分歧,不然,即便输出数据经由过程了客户端考证,也没法经由过程服务器端考证。上面将经由过程一个典范实例来进一步申明考证控件的完成办法,以加深读者的了解。

  2、典范使用

  本节将利用上文所先容的开辟考证控件的办法,创立一个名为TelNumValidator的考证控件。该控件用于考证用户输出的德律风号码是不是切合划定规矩。假如不切合划定规矩,那末静态提醒毛病信息。其效果如。



最终效果(输出毛病形态下)

  如所示,页面中次要包含了一个TextBox文本框和一个提交按钮。用户必需输出准确格局的德律风号码,才干够经由过程考证。中,因为没有输出准确的德律风号码,当单击提交按钮时,则没法完成提交页面。同时,页面还分红蓝两种色彩给出了提醒信息。下文具体解说了考证控件的完成历程。

  起首,在完成TelNumValidator控件之前,必需进一步明白考证前提。

  关于国际德律风号码,通常是两种形式:一种是区号为3位,德律风号码为8位,另外一种是区号为4位,德律风号码为7位。据此,可得出用于考证的正则表达式:“d{3}-d{8}|d{4}-d{7}”。不管是服务器端考证逻辑,仍是客户端考证逻辑,都必需服从以上考证前提。只要切合这两种形式的输出数据才干够经由过程考证。

  上面列出了考证控件TelNumValidator的服务器端考证的源代码。

usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Text;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Text.RegularExpressions;

namespaceWebControlLibrary
{
 
 [ToolboxData("<{0}:TelNumValidatorrunat=server>
  </{0}:TelNumValidator>")
 ]

 publicclassTelNumValidator:BaseValidator
 {
  //界说公有变量,个中_clientFileUrl暗示JavaScript文件存储目次
  //ValidationExpression暗示正则表达式

  privatestring_clientFileUrl="ClientFiles/";
  privateconststringValidationExpression=@"(d{3}-d{8}|d{4}-d{7})";
  //界说属性ClientFileUrl,用于猎取或设置剧本绝对路径
  [
   Description("猎取或设置剧本绝对路径"),
   DefaultValue("ClientFiles/"),
   Category("Appearance")
  ]

  publicstringClientFileUrl
  {
   get
   {return_clientFileUrl;}
   set 
   {_clientFileUrl=value;}
  }
  //重写AddAttributesToRender,为考证控件增加特别属性evaluationfunction和validationexp
  protectedoverridevoidAddAttributesToRender(HtmlTextWriterwriter)
  {
   base.AddAttributesToRender(writer);
   if(RenderUplevel)
   {
    writer.AddAttribute("evaluationfunction","TelNumValidatorEvaluateIsValid",false);
    writer.AddAttribute("validationexp",ValidationExpression);
   }
  }
  //重写EvaluateIsValid办法,界说服务器端考证逻辑
  protectedoverrideboolEvaluateIsValid()
  stringcontrolValue=GetControlValidationValue(ControlToValidate);
  if(controlValue==null)
  {
   returntrue;
  }
  controlValue=controlValue.Trim();
  try
  {
   Matchm=Regex.Match(controlValue,ValidationExpression);
   return(m.Success&&(m.Index==0)&&(m.Length==controlValue.Length));
  }
  catch
  {
   returnfalse;
  }
 }
 //重写OnPreRender办法,注册客户端剧本程序
 protectedoverridevoidOnPreRender(EventArgse)
 {
  base.OnPreRender(e);
  if(RenderUplevel)
  {Page.ClientScript.RegisterClientScriptBlock(typeof(TelNumValidator),
   "ClientValidator",GetClientFileUrl("ClientValidator.js"));
  }
 }

 //完成帮助函数GetClientFileUrl,用于猎取JavaScript文件的完全路径

 privatestringGetClientFileUrl(stringfileName)
 {
  stringtempClient=String.Format("<scriptlanguage="javascript"src="{0}"></script>",(ClientFileUrl+fileName));
  returntempClient;
 }
}
  从以上代码可知,TelNumValidator控件的完成,是依照上文申明的考证控件完成步骤编写的。该类完成了以下主要逻辑:

  (1)考证控件类TelNumValidator类从BaseValidator基类承继,因而,该类主动承继了通用考证控件应当具有的属性、办法和事务。

  (2)界说用于猎取或设置剧本绝对路径的属性ClientFileUrl,默许值为“ClientFiles/”。经由过程该属性页面开辟者可自界说客户端考证剧本文件的目次,如许可增添控件的天真性。

  (3)重写AddAttributesToRender办法,为控件增加特征evaluationfunction和validationexp。特征evaluationfunction对应的值是举行客户端考证的办法名。特征validationexp对应的值是用于考证的正则表达式,经由过程将其出现到客户端,那末客户端考证剧本便可利用该表达式。

  (4)重写EvaluateIsValid办法,界说服务器端考证逻辑。(5)重写OnPreRender办法,注册客户端剧本文件ClientValidator.js。
<P>  读者大概已注重到该考证控件必要完成客户端考证,而客户端考证包括在ClientValidator.js文件中。默许情形下,该文件位于“ClientFiles”文件夹中。

  上面列出客户端考证文件ClientValidator.js的源代码。

functionTelNumValidatorEvaluateIsValid(val)
{
 varvalidationexp=val.validationexp;
 varvalueToValidate=ValidateTrim(ValidateGetValue(val.controltovalidate));
 varrx=newRegExp(validationexp);
 varmatches=rx.exec(valueToValidate);
 return(matches!=null&&valueToValidate==matches);
}

/*猎取考证方针控件的输出数据*/

functionValidateGetValue(id)
{
 varcontrol;
 control=document.all;
 if(typeof(control.value)=="string")
 {
  returncontrol.value;
 }
 if(typeof(control.tagName)=="undefined"&&typeof(control.length)=="number")
 {
  varj;
  for(j=0;j<control.length;j++)
  {
   varinner=control;
   if(typeof(inner.value)=="string"&&(inner.type!="radio"||inner.status==true))
   {
    returninner.value;
   }
  }
 }
 else
 {
  returnValidatorGetValueRecursive(control);
 }
 return"";
}

/*往除空格处置*/

functionValidateTrim(s)
{
 varm=s.match(/^s*(S+(s+S+)*)s*$/);
 return(m==null)?"":m;
}
  由上代码可知,ClientValidatior.js文件中仅包含一个主办法TelNumValidatorEvaluateIsValid。该办法完成了与服务器端考证中,EvaluateIsValid办法不异的逻辑。同时,还包含两个帮助办法ValidateGetValue和ValidateTrim。前者用于猎取考证方针控件的输出数据,后者用于往除空格处置。

  为了测试以后自界说考证控件,上面枚举了Default.aspx页面源代码。

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%>
<%@RegisterTagPrefix="Sample"Assembly="WebControlLibrary"Namespace="WebControlLibrary"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>完成一个考证控件</title>
</head>
<body>
<formid="form1"runat="server">
<divstyle="font-size:small;">
<asp:TextBoxID="textbox"runat="server"></asp:TextBox>
<asp:ButtonID="Button1"runat="server"Text="提交"></asp:Button>
<Sample:TelNumValidatorID="demo1"runat="server"Display="dynamic"ControlToValidate="textbox"Text="请输出无效的德律风号码"ErrorMessage="准确的格局为010-12345678大概0123-1234567"></Sample:TelNumValidator>
<br/><br/>
<asp:ValidationSummaryrunat="server"ForeColor="blue"DisplayMode="singleParagraph"HeaderText="毛病信息:"ID="ValidationSummary1"></asp:ValidationSummary>
</div>
</form>
</body>
</html>
  在以上完成中,请读者重点存眷自界说考证控件的属性设置。该控件次要设置了以下几个主要属性。

  (1)ControlToValidate属性,经由过程设置该属性,从而完成了考证控件TelNumValidator和考证方针控件TextBox之间的联系关系。

  (2)Display属性,经由过程设置该属性可设置毛病信息显现体例。

  (3)ErrorMessage,该属性用于猎取或设置考证失利时ValidationSummary控件中显现的毛病信息的文本。为此,在代码中还设置了一个对应的ValidationSummary控件。

  (4)Text,该属性用于猎取或设置考证失利时考证控件中显现的文本。

  必要注重的是以上4个属性都承继自BaseValidator基类。别的,假如使用程序部署必要,开辟职员还能够修正考证控件的ClientFileUrl属性。

  3.小结

  本文经由过程一个典范示例申明了考证控件的完成办法。信任读者已可以感应,假如完成高质量的考证控件,开辟职员必需把握多方面的常识,特别是JavaScript言语等。别的,本文所触及的JavaScript代码被包括在js文件中。开辟职员也能够将这些代码作为资本文件编译到考证控件的dll文件中。这类完成办法十分有益于控件的部署事情。有乐趣的读者能够试一试。听03很多师兄说主讲老师杭城方讲课很差就连旁听也没有去了)

小魔女 发表于 2015-1-19 22:42:11

使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。

谁可相欹 发表于 2015-1-27 08:42:42

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

简单生活 发表于 2015-2-5 03:59:22

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

愤怒的大鸟 发表于 2015-2-11 03:42:40

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

莫相离 发表于 2015-3-1 20:35:28

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

只想知道 发表于 2015-3-10 23:30:00

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

因胸联盟 发表于 2015-3-17 16:08:01

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。

再见西城 发表于 2015-3-24 10:40:19

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
页: [1]
查看完整版本: ASP.NET网站制作之ASP.NET 2.0服务器控件之考证控件示例