ASP.NET入门随想之检票的老太太

asp.net

  德国足协告诫那些可能前往德国观看2006年世界杯赛的球迷要提防假票,不要从非代理商和票贩子手中购票。世界杯门票都是高科技产品,门票被植入微芯片,只有通过合法途径取得门票的球迷才能入场。假票现象在近些年的足球大赛上泛滥成灾,德国足协希望能通过宣传避免世界杯球迷成为其受害者。

  ■ 验明正身 - 数据有效性

  世界杯万人瞩目但门票有限,所以有人造假有人买假,安联球场的大门前站几位检票员必不可少,而我们的程序有时也一样。当你接到一个累积数年的数据表时,发现单单联系电话都有23种格式时,你是否也感叹到,在用户提交数据时系统也需要靠检票员来验证一下?可是我们还是发现象数据验证这样的内容往往容易被人忽视,许多系统常让拿着公车票的家伙混进球场撒野,各种数据如同发情野马一般长驱直入,先不说安全问题,从数据有效性的角度看,几年后它会象霉菌一样让整个数据库腐烂变质,垃圾成堆。不过常会有另一种声音在耳旁响起:"搞那么复杂做什么呀,这个系统、甚至是这个企业没等霉菌开始起作用,它就挂了!"

  应用程序必须确保系统的数据有效性有二层含义:一是格式验证,要确保数据属于系统设计时定义的类型、范围,甚至是行业的特定格式,这通常在系统的UI层来完成验证;二是逻辑验证,数据间往往符合特定的业务逻辑规则,数据操作不能破坏其间逻辑关系而造成系统异常,这通常在系统的底层来完成验证。本文主要讨论前者的实现。

  不过许多系统为了保持数据有效性常常矫枉过正,界面充斥着拥有复杂输入格式限制的文本输入框,要求用户花费大量时间来进行自我数据校正,填写个表单比高考画框框还要让人费劲,企业用户还好办些,最多抗议两声也就接受,互联网用户可不吃这一套,来点创意!

  ■ 检票的老太太们 - 验证器架构

  WEB应用程序是基于表单来输入数据。为了确保数据有效性,我们必须在服务端对输入数据进行检验,但考虑到用户感受,往往又在客户端插入些javascript脚本。客户端验证就像我们呼吸空气时的鼻子,先把颗粒物杂质等阻挡在外面,从而大大减轻了肺的负担;服务器端验证是构建安全Web应用程序必需的,只有服务器端验证才可以提供真正应用程序级的安全。双重校验,琐碎无聊,怪不得没几人喜欢。

  .NET首先将验证器与验证对象分离成两个部份,验证对象暴露验证属性,检票员们分头监督验证对象,完成数据校验,比较复杂的校验可以让几位检票员一起守着;每个页面需要一位领头,让她拿着名单,依次催促页面内每个验证器对所辖输入域进行验证,汇总出结果;最后页面需要某些控件能够自动触发验证,这个角色通常是由带有回发功能的Button类控件来扮演,如图13-1所示。

  参与Web窗体验证的服务器控件必须实现IValidator接口,这是检票员们的共同特征。用Volidate方法完成校验过程,得出一个结果值IsValid属性,包含拒绝放行的理由ErrorMessage属性。于是有如下定义:

public interface IValidator{
 string ErrorMessage{set;get;}
 bool IsValid{set;get;}
 void Volidate{};
}
  作为校验行为的原子触发单位,页面类设置了一些必要的成员:Page.Validators集合是页面的验证器容器,Page.Validate方法将依次调用容器中每个验证器的Validate方法更新各自的IsValid属性,Page.Valid属性用于汇总页面的校验结果,它就是页面的心灵之锁。

  CausesValidation属性是引起回发控件的公共属性,为真时控件在Click事件处理之前自动调用Page.Validate方法,这样使得我们在大多时候不需要显式地去调用Page.Validate方法即可完成校验过程。

  ■ 模范 - BaseValidator类及客户端验证

  尽管在ASP.NET中,任何通过实现IValidate接口的类都可以被认为是验证器,但在实际应用中,我们通常把验证器设计成服务器控件。

  BaseValidator是派生自Label类的抽象基类,除了实现IValidator接口,主要执行校验必需的各种通用任务,包括从被验证对象提取值、定义校验抽象方法、产生客户端验证脚本、完成在Page.Validators集合中注册等等。通过继承它,我们只要集中精力去实现服务器端和客户端的验证逻辑就可以实现自定义验证器。下例为一检查CheckBoxList是否有勾选1个以上的自定义验证器范例。

using System;
using System.Collections;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace essay.Controls{
 //派生于BaseValidator基类的自定义验证器
 public class RequiredCheckBoxListValidator : BaseValidator {
  private ListControl m_ListCtl;
  //启用客户端验证
  public RequiredCheckBoxListValidator(){
   base.EnableClientScript = true;
  }
  //确定由ControlToValidate指定的被验证控件是否有效
  protected override bool ControlPropertiesValid(){
   Control webControl = this.FindControl(ControlToValidate);
   if (webControl != null){
    m_ListCtl = (ListControl)webControl;
    return true;
   }
   else
    return false;
  }
  //定义校验规则
  protected override bool EvaluateIsValid(){
   return (m_ListCtl.SelectedIndex != -1);
  }
  protected override void OnPreRender(EventArgs e) {
   if (this.EnableClientScript) this.GenerateScript();
   base.OnPreRender(e);
  }
  //产生并向页面注入客户端验证脚本
  protected void GenerateScript(){
   StringBuilder sb_Script = new StringBuilder();
   sb_Script.Append("<script language=\"javascript\">\n");
   sb_Script.Append("function cb_vefify(val) {\n");
   sb_Script.Append("var isValid=false;\n");
   sb_Script.Append("var val = document.all[document.all[\""+this.ID+"\"].controltovalidate];\n");
   sb_Script.Append("var col = val.all;\n");
   sb_Script.Append("if ( col != null )\n");
   sb_Script.Append("for ( i = 0; i < col.length; i++ ) \n");
   sb_Script.Append("if (col.item(i).tagName == \"INPUT\") \n");
   sb_Script.Append("if ( col.item(i).checked )isValid=true; \n");
   sb_Script.Append("return isValid;");
   sb_Script.Append("}\n");
   sb_Script.Append("</script>");
   this.Page.RegisterClientScriptBlock("RBLScript", sb_Script.ToString());
   //通过设置验证器的evaluationfunction attribute来指定其客户端验证逻辑
   this.Attributes["evaluationfunction"] = "cb_vefify";
  }
 }
}

  ■ 我很丑可是我很能干- 正则表达式(Regular Expression)

  正则表达式被用于描述某一类特定格式的字符串方法,能简洁地、能几何倍数地改善文本处理效率,但它不招人疼所以让人厌恶,原因并不是概念有多高深,主要是它长得太丑!一个字符串是否符合某一类特定格式的字符串,关键在于它是否符合这个特定格式的多个匹配规则。

  理解正则表达式的钥匙在于提炼每条匹配规则的三个要素:字符子集、重复次数与位置。例字符串"两位数字开头三位英文字母结尾",写正则表达式之前需要我们这么变换句式:"开头 数字{2位} 任意字符{0或多位} 字母{3位} 结尾",正则表达式为"^ [0-9]{2} [\s\S]* [a-zA-Z]{3} $"。

  在每条匹配规则中,可能出现的字符子串有个范围,属于固定的字符子集,正则表达式用常量、区域和逻辑运算来表示这个集合,如图13-2所例,值得注意是部份字符已被定义成元字符,具有特殊的含义。

  每条匹配规则中,其字符子集可能出现重复,可以用两种方法表示:一是紧跟着字符子集后加个大括号,内标数字,另一种用元字符表示,如图13-3例。每条匹配规则中字符子集的位置由其在正则表达式中的位置决定,整个字符串开头用"^"表示,结尾用"$"表示。

  在很多时候,两条或以上的匹配规则可能要用到同一个字符子集,如html标记中,标签声明应当是同一字符子集,比如"<div>……</div>"。如果要定义一个字符子集以便其后引用,可用小括号标识,用"\数字"引用。

  正则表达式的应用范围很广,除了数据校验外,UBB论坛、页面动态转静态、搜索技术等时常出现它的身影,"我很丑可是我很能干",在这里我们仅仅只是探讨表达式的书写方法。最后用两个实例总结,如图13-4所示。

时间: 2024-07-29 08:52:52

ASP.NET入门随想之检票的老太太的相关文章

ASP.NET入门随想之抽象的力量

 ? ASP.NET入门随想之抽象的力量 小 时看过一故事:三书生欲进京赶考,问一老僧三人前景如何,老僧端坐如山,最后缓缓伸出一指.于是三书生路上争论不休,不明老僧指哪一人会黄榜题名,不料后 来三人同时高中,高兴之余,不禁对老僧的权威起了疑心.三人衣锦返乡后,追问老僧,老僧及端坐如山,缓缓曰:一指表示三人皆中,三人立马晕倒. ■ASP的编程思想 -写八股文 MS在java技术的冲击下匆忙推出ASP技术.要不是因为WinServer操作系统的霸主地位,粗陋的ASP不太可能在OO推行二十几年.C++

ASP.NET入门随想六之大航海家

asp.net 多隆云:我和韦春花的关系是很纯洁的:网易称其和迷蝶女友的关系是培训双向选择制:杨振宁言<易经>思想阻碍了中国近代科学的发展:逻辑学家论:概念间的关系有五种,即同一.包含.交叉.分离.互斥.而康托尔却认为:关系是有序偶. ■ 我要懒+笨 - 程序设计的终极目标 前不久社区里出现题为<这样的程序员是否算是一个合格的程序员?>的热贴,楼主言一手下编码花时间比别人多但代码规范健壮,设问这样的程序员是否可以留用且如何用?顿时掀起一片哗然,展开在中国这个特定的环境下何为程序设计

ASP.NET入门随想之明明白白我的心

asp.net 有一群说着同样语言的人,计划修一座高耸入云的高塔直达天庭,以证明族群团结的力量,塔很快就初具规模.这下可惊动天庭的神,他想这人和神都成邻居了,还怎么去统治人类?于是便施魔法扰乱人们的语言,使他们无法沟通,于是高塔再也无法继续修建. ■ 明明白白我的心 - 人机交互(Human-Computer Interaction) 博客园里有一篇<给妈妈写程序>感人肺腑,说的是作者常常为了指导50出头的妈妈完成COPY之类的操作耗尽心思,最后为其定做一个只需点击两下的程序,由此推出UI设计

ASP.NET入门随想之服务器控件模型

asp.net|服务器|控件 他迷上了珍珠奶茶.说实话,以前他一直觉得珍珠奶茶挺蠢的,真不知道是那一个天才的点子,居然把粉圆和泡沫红茶搅和在一起,还加上一根那么滑稽的超大吸管:妹妹刚迷上珍珠奶茶的时候,他还挺嗤之以鼻的呢.但这天以后,他几乎天天都会去买一杯珍珠奶茶,愈喝愈觉得珍珠奶茶的风味很特别,的确满好喝的.知道他迷上珍珠奶茶,妹妹还笑他:"早跟你说好喝你不信,男生就是迟钝." -- 管家琪<珍珠奶茶的诱惑> ■ 面向对象的粉圆 - 服务器控件模型 XHTML的一个重要目

ASP.NET入门随想之代言人

asp.net 本报讯 著名品牌服务器控件(Control)携手奥运冠军客户端HTML标签作为形象代言人,新形象以"极速体验"为主题,既诠释了服务器控件本身强大的信息处理能力,也表现客户端HTML标签希望用灵动和亲切来证明自己的决心与态度. ■ 内与外 - property与attribute 近日Google发布除英文外的唯一名称--谷歌,中国用户一片哗然, 暂且不论这个谷歌是不是比胡弋更合适,但Google想借此阐述产品内涵,取悦中国用户之心路人皆知:今年WEB2.0引无数风投竞折

ASP.NET入门随想之多态、接口与委托

asp.net     曾几何时,我们居住的陆地沉睡在海底,大陆也紧密的联系在一起,千百年过去了七大洲的地壳板块在缓缓移动,喜马拉雅山在慢慢增高,世界在变,唯一不变的是变化. ■ 软件开发的悖论 - 把变化变成计划 在软件开发活动的过程中,常被一个悖论所缠绕:不写码就搞不清该做什么:搞不清做什么又不知道该如何写码. 人的思维是很随意的东西,不同的人,或同一个人的不同阶段,对同一件事情的看法都会有差异,可谓是远看成岭侧成峰,远近高低各不同.随意再加上变化,常常引起项目流产或工期大大拖延. 之所以会

ASP.NET编程入门随想之宽容(修改版)

asp.net|编程 相关文章:ASP.NET编程入门随想之宽容 古老的山谷村民生活富足,守旧老人维护着经典和秩序.一位不满现状的漂泊者却宣称外面有更好的世界在等着大家,并鼓动村民跟随前往.但守旧老人的威严和律法的神圣压制了村民的躁动,漂泊者也被处死.一天灾难降临山谷.尽管守旧老人依然试图维护经受村民的求生欲望挑战的律法.但暴动还是发生,老人们被击败,新的道路和新的生活被村民找到.怀着感恩之心,后人把以前的漂泊者奉为先知,尽管他早已尸骨无存. -- 房龙<宽容•序言> ■ 宽容 – W3C 的

ASP编程入门进阶(十四):Browser &amp;amp; Linkin

编程 一.Browser Capabilities组件 该组件最主要的作用是:提取识别客户端浏览器的版本信息. 其原理是这样的:当客户端浏览器向服务器发送页面请求时,同时会自动发送一个User Agent HTTP标题,而该标题是一个声明浏览器及其版本的 ASCII 字符串.而Browser Capabilities组件就将User Agent映射到在文件Browscap.ini中所注明的浏览器 , 并通过BrowserType对象的属性来识别客户浏览器. 若该对象在 browscap.ini

ASP编程入门进阶(一) 安装配置服务器

编程|服务器|服务器 申明:asp编程入门进阶系列文章COPY自http://www.cnbruce.com/blog/ 部分运行代码请到该站进行在线测试ASP编程入门进阶(一):安装配置服务器 鉴于ASP脚本语言是在服务器端IIS或PWS中解释和运行,并可动态生成普通的HTML网页,然后再传送到客户端供浏览的这一特点.我们要在本机上进行调试,那就要求我们的个人电脑具有服务器的功能. 不要看到"服务器"三个字就感到担心:我的机子配置这么底,性能这么差,是不是不能配啊.放心!配个服务器,