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

2014-05-25  来源:本站原创  分类:实用技巧  人气:1 

  德国足协告诫那些可能前往德国观看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所示。

相关文章
  • ASP.NET入门随想之检票的老太太 2014-05-25

    德国足协告诫那些可能前往德国观看2006年世界杯赛的球迷要提防假票,不要从非代理商和票贩子手中购票.世界杯门票都是高科技产品,门票被植入微芯片,只有通过合法途径取得门票的球迷才能入场.假票现象在近些年的足球大赛上泛滥成灾,德国足协希望能通过宣传避免世界杯球迷成为其受害者. ■ 验明正身 - 数据有效性 世界杯万人瞩目但门票有限,所以有人造假有人买假,安联球场的大门前站几位检票员必不可少,而我们的程序有时也一样.当你接到一个累积数年的数据表时,发现单单联系电话都有23种格式时,你是否也感叹到,在用

  • ASP编程入门进阶(十三):Ad & Content Rotator 2013-10-10

    ASP的强大不仅仅局限于接受和显示的交互,更多的是运用ActiveX 组件进行更强大的Web应用. 那究竟ActiveX组件为何物?它又是如何运作的呢?其实ActiveX Server Components(ActiveX 服务器组件)是一个存在于 WEB 服务器上的文件,该文件包含执行某项或一组任务的代码,组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码.很形象的一句话:运用组件直接采用别人经典的功能强大的程序.只不过这程序已被封装了的. 那具体ActiveX组件是如何产生.如何得

  • ASP编程入门进阶(一):安装配置服务器 2013-12-09

    本人的水平有限,难免有疏忽遗漏之处,还望大家批评指正,在此先谢过. ASP编程入门进阶(一):安装配置服务器 鉴于ASP脚本语言是在服务器端IIS或PWS中解释和运行,并可动态生成普通的HTML网页,然后再传送到客户端供浏览的这一特点.我们要在本机上进行调试,那就要求我们的个人电脑具有服务器的功能. 不要看到"服务器"三个字就感到担心:我的机子配置这么底,性能这么差,是不是不能配啊.放心!配个服务器,就是多装个软件,况且就自己一个人用,根本没有必要多虑.那具体的装个什么软件呢?刚才我们

  • ASP.NET入门之HTML服务器控件概述 2014-06-14

    这篇文章主要介绍了ASP.NET入门之HTML服务器控件,对于初学者来说很有借鉴学习价值,需要的朋友可以参考下 ASP.NET 中的HTML服务器控件是服务器可理解的HTML标签. ASP.NET 文件中的 HTML 元素默认作为文本进行处理.为了使这些元素可编程化,需要向 HTML 元素添加 runat="server" 属性.该属性指示该元素应作为服务器控件进行处理. 注意: 1.所有 HTML 服务器控件必须位于带有 runat="server" 属性的标签内

  • ASP.NET 入门的五个步骤 2014-10-17

    作者:Rob Howard 2000 年 11 月 12 日 将于 2000 年 12 月 28 日存档 欢迎访问 Nothin´ but ASP.NET 专栏,下面我将为大家深入介绍 ASP.NET 中某些重要的新特性,以及一些其他 .NET Framework 技术. 在第一个专栏中,我们将讨论 ASP.NET 入门的五个步骤.以后的专栏我们将陆续探讨 ASP.NET 中的其他优秀功能(如部署.状态管理.进程模型.控件.安全等方面的变化). 步骤 1:下载和安装 .NET SDK ASP.N

  • ASP编程入门进阶(十四):Browser & Linking 2014-12-07

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

  • ASP编程入门进阶(七):内置对象Server 2013-12-25

    Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务.(IIS HELP翻译) 有了 Server 对象,你就可以在服务器上启动 ActiveX 对象例程,并使用 Active Server 服务提供象 HTML 和 URL 编码这样的函数. 一,Script.ScriptTimeout 在脚本运行超过一段时间之后,即作超时处理. 服务器一般的默认脚本运行时间是90秒. 你可以从"Internet信息服务"中"默认Web站点&q

  • FLASH与ASP通信入门教程--做真正属于自己的留言本第1/5页 2014-01-09

    经常有人问我FLASH留言板的制作方法,无奈这东西一句两句没办法说清楚,于是就萌发了写教程的想法.可后来又一想,授人以鱼,不如授人以渔,还不如集中精力好好讲将FLASH与ASP的通讯原理,原理通了,具体项目就可以自由发挥了. 我这个教程面向初级群体,在开始教程之前,我假设你已经具备FLASH操作基础知识,了解IIS配置以及运行环境.尽管FLASH与ASP通信方式有很多,但这篇教程中我选择使用LoadVars类,一因为LoadVars类容易掌握,易于讲解:二是因为它不牵扯太多其他方面的知识.另外,

  • ASP编程入门进阶(二十):ADO组件之显示数据记录 2014-12-19

    学习ASP的万里长征就快到终点了:等把ASP的ADO组件搞定.当然这也是最重要的一步,几乎前面所有的学习都是为了这个最终的目的.OK,下面就来详细系统地来一一掌握,步步为营,各个击破. 一,拥有数据库 可以这么说:静态页面和动态页面最大的区别就是采用了数据库.有关一个WEB程序采用数据库和不采用的优越性比较,就不去细细分析了,主要精力还是放在如何使用数据库,如何熟练运用数据库,如何更灵活地运用数据库等等--其中运用操作数据库主要是对数据库内容进行:显示.插入.修改.更新.查询和删除. 这些方法当

  • ASP编程入门进阶(十八):FSO组件之文件操作(下) 2013-10-02

    一,fso.GetFile 提取文件相应的 File 对象 1,getfile.asp <% whichfile=Server.MapPath("cnbruce.txt") Set fso = CreateObject("Scripting.FileSystemObject") Set f1 = fso.CreateTextFile(whichfile,true) f1.Write ("This is a test.My Name is cnbruc

  • ASP编程入门进阶(十):Global.asa文件 2013-11-29

    我们已经知道Application和Session对象的OnStart.OnEnd事件的脚本,都必须是在 Global.asa 文件中声明的.那究竟Global.asa是什么样的一个文件?它的作用有何?又该如何运用呢?且听我慢慢道来. 首先.asa是文件后缀名,它是Active Server Application的首字母缩写.Global.asa文件可以管理在ASP应用中两个非常苛刻的对象:Application.Session. 它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并

  • ASP编程入门进阶(二十):ADO组件之分页程序 2013-12-03

    应该来说,学会了如何插入记录,如何显示记录,那么现在简单的完整的文章系统.新闻系统和留言系统不成问题.那接着下面的问题就是:随着信息内容的不段增加,单独通过一张页面显示所有信息是不行也是很不理性的.所以,解决的办法就是采用分页技术. 1,rs.RecordCount 很显然,RecordCount就是用来显示数据库表中一共多少条记录的,也可以形象地说表中一共有多少行.经常用在分页中就是一共有N篇文章等总计的信息显示. 2,rs.PageSize rs.PageSize也就是一页的大小,也就表示一

  • ASP编程入门进阶(八):内置对象Session 2013-12-08

    ASP对象中除了用于发送(Response).接收和处理数据(requeest).服务器访问(Server)的对象外,还有一些非常实用的标记Active Server应用程序(Application)和单个用户信息(Session)的对象. Session对象 该对象在ASP使用中占相当大的比例.由于网页是一种无状态程序,无法得知用户浏览状态.在ASP中,通过Session对象来记录使用者私有的数据变量,以作为用户再次对服务器提出要求时做确认,用户在程序的Web页面之间跳转时,存在Session

  • ASP编程入门进阶(五):内置对象Response 2014-01-05

    通过对Request对象的学习,可以了解到,Request对象是服务器端用来获取客户端的信息的. 但作为服务器和客户端进行交互,是不是还缺少服务器端向客户端发送信息呢?对象Response正是担任此责任. 负责将信息传递给用户的对象就是Response了,它可动态地响应客户端的请求,并将动态生成的响应结果返回给客户端浏览器. 一,Response.write 在Response中write方法是使用最频繁的一个了,write就是写:将指定的字符串写到当前的 HTTP 输出. 1,write.as

  • ASP编程入门进阶(廿一):DAO SQL之建立数据库表 2014-01-22

    你是否为自己设计的数据库感到满足了呢?你确信就不要对其再处理?比如新建立数据库表,比如建立或者修改某个字段--当然这些都属于设计数据库之列. 那么,你正常的操作又是不是下载数据库到本机,然后打开之进行修改,接着再上传上去?十有八九都是如此-_-! 现在,你可以接触下有关于此的信息了,毕竟代码的功能是为手动的操作省了不少时间.不过代码的生成也还不是手工?呵呵:) 1,建立数据库文件cnbruce.mdb(不设计任何表) 建立数据库的代码: <% Option Explicit dim databa

  • 推荐ASP超速入门视频教程 2014-01-30

    [基础操作][本教程全部更新完] 1.初识网页 2.动态网页和静态网页概述 3.ASP概述 4.IIS的安装和设置 5.浏览ASP页面 6.创建一个简单的ASP程序 [利用脚本语言创建动态网页] 7.脚本语言概述 8.VBScript简介 9.数据类型 10.声明变量 11.命名的规则 12.运算符 13.流程控制语句 14.JavaScript简介 15.基本结构和语法 16.变量规则 17.JS流程控制语句 18.总结 [ASP基本语法] 19.ASP程序的特点 20.ASP标记的用法 21

  • ASP编程入门进阶(四):内置对象Request 2014-02-02

    系统学习ASP,就是先从ASP的几大内置对象开始的. 一般称五大对象:Request.Response.Server.Session.Application 今天先来看看Request对象. 当然一直还没有提到的就是,ASP到底是什么样?我看代码怎么知道是ASP代码? 很简单,当看到"<%"和"%>"就表明是ASP,并且两者之间的就是ASP源码. 那为什么要学对象,对象的作用又是如何的? 其实ASP所提供的这些可在脚本中使用的内建对象,使用户更容易收集通

  • ASP编程入门进阶(十一):Chat聊天程序 2014-02-08

    通常的聊天室所采用的程序,也就是Chat程序了,其基本结构原理是不会采用到数据库的.那究竟采用什么技术呢?我们知道ASP变量当中Session变量的作用是记录单个用户的信息,并且能跟踪用户的行为:Application对象的作用则起的全局变量,可以实现站点多个用户之间在页面中共享信息的. 那可以想象,在针对当前聊天程序中,一个聊天成员即为一个Session变量,聊天成员之间的会话则当成Application变量进行共享显示,以使各成员都能看见. 那下面就采用一很经典的实例程序,进行了解和分析.

  • ASP编程入门进阶(九):内置对象Application 2014-02-21

    在Web应用程序中,当一个用户访问该应用时,Session类型的变量可以供这个用户在该Web应用的所有页面中共享数据:如果另一个用户也同时访问该Web应用,他也拥有自己的Session变量,但两个用户之间无法通过Session变量共享信息,而Application类型的变量则可以实现站点多个用户之间在所有页面中共享信息.可以理解Session是局部变量,而Application则为全局变量. 在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序.我们非但可以使用 Applic

  • ASP编程入门进阶(十九):ASP技巧累加(二) 2014-06-10

    严格控制Session 可以将不需要Session的内容(比如帮助画面,访问者区域,等等)移动到关闭Session的独立ASP应用程序中.在基础页面上,可以给ASP一个指示,让它不需要使用Session.将下面的代码直接加入到ASP页面的头部: <%@EnableSessionState=False%> 在Web服务器上缓存经常使用的数据 典型的情况是:ASP页面从后台存储中取回数据,然后以超文本标记语言(HTML)的形式形成结果.不管数据库的速度如何,从内存中取回数据要比从后台存储设备中快得