ASP.NET入门随想 老燕
动态(07-5-16):
江郎才尽……
|
首页
|
发新随笔
|
发新文章
|
联系
|
订阅
|
管理
[ASP.NET入门随想十三] 检票员—— 验证器架构
[ASP.NET入门随想十三] 检票员
—— 验证器架构
德国足协告诫那些可能前往德国观看2006年世界杯赛的球迷要提防假票,不要从非代理商和票贩子手中购票。世界杯门票都是高科技产品,门票被植入微芯片, 只有通过合法途径取得门票的球迷才能入场。假票现象在近些年的足球大赛上泛滥成灾,德国足协希望能通过宣传避免世界杯球迷成为其受害者。
■ 验明正身 - 数据有效性
世界杯万人瞩目但门票有限,所以有人造假有人买假,安联球场的大门站几位检票员必不可少。当你接到一个累积数年的数据表,发现单单联系电话都有23种格式 时,你是否也感叹到,在用户提交数据时系统也需要靠检票员来验证一下?可是我们还是发现象数据验证这样的内容往往容易被人忽视,许多系统常让拿着公车票的 家伙混进球场撒野,各种数据如同发情野马一般长驱直入,先不说安全问题,从数据有效性的角度看,几年后它会象霉菌一样让整个数据库腐烂变质,垃圾成堆。不 过常会有另一种声音在耳旁响起:“搞那么复杂做什么呀,这个系统、甚至是这个企业没等霉菌开始起作用,它就挂了!”
应用程序必须确保系统的数据有效性有二层含义:一是格式验证,要确保数据属于系统设计时定义的类型、范围,甚至是行业的特定格式,这通常在系统的UI层来 完成验证;二是逻辑验证,数据间往往符合特定的业务逻辑规则,数据操作不能破坏其间逻辑关系而造成系统异常,这通常在系统的底层来完成验证。本文主要讨论 前者的实现。
不过许多系统为了保持数据有效性常常矫枉过正,界面充斥着拥有复杂输入格式限制的文本输入框,要求 用户花费大量时间来进行自我数据校正,填写个表单比高考画框框还要让人费劲,企业用户还好办些,最多抗议两声也就接受,互联网用户可不吃这一套,来点创 意!
■ .NET的检票员们 - 验证器架构
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);
}
//
产生并向页面注入客户端验证脚本
< span style="color: #008000;">
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所示。
发表于 2006-07-03 14:36
老燕
阅读(2650)
评论(7)
编辑
收藏
所属分类:
ASP.NET入门随想
评论
#1楼
不容易呀
终于等到新文章发布了
其实我一直很佩服老大的文笔
而小弟一向对杂文感兴趣想必写出的文章也就那水平啦
都是近鲁迅这不通文我就是那一个,呵呵,不过一个写程序的又不是写文章的.而向老大这样对知识的理解有一定的境界,而且还能写出这么好的文章,真是我学习的榜样.
向老大学习,希望继续出高质量的作品
#2楼
收藏了!又一个良师益友!!谢谢!!!
#3楼
据小弟所知,从非代理商和票贩子手中购的票只要不是假票,一点问题都没有。只要到时去ticket service point去凭着护照改票就可以了。因为小弟也检过两次票。
#4楼
[
楼主
]
谢谢众位的捧场,您们的关注是我的动力,请多提意见建议
#5楼
还有第十四吗
#6楼
终于看完了
写得很很好,不得不顶一下...
#7楼
楼主已经停止更新了吗
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2006-07-04 16:57 编辑过
另存
打印
所属分类的其他文章:
·
[ASP.NET入门随想十三] 检票员—— 验证器架构
·
[ASP.NET入门随想十二] 代言人—— 客户端行为
·
[ASP.NET入门随想十一] 信客—— 事件框架
·
[ASP.NET入门随想十] 珍珠奶茶 ——服务器控件模型
·
[ASP.NET入门随想九] 宽容——W3C 的Web标准(修改版)
·
[ASP.NET入门随想八]明明白白我的心——ASP.NET的页面模型
·
[ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托
·
[ASP.NET入门随想六]大航海家——OO思想的类间关系
·
[ASP.NET入门随想五]金庸群“粒”传——OO思想的对象与类
·
[ASP.NET入门随想四]吸星大法——页面的OO思想篇
最新IT新闻:
·
微软推新型搜索技术"BrowseRank"挑战谷歌
·
2008年7月26日IT博客精选
·
微软每年向Apache捐10万美元支持开源软件
·
AOL将关闭3个网站以降低成本 集中发力广告
·
谷歌网页索引数量突破1万亿个
博客园新闻频道
博客园首页
社区
<
2007年12月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
公告
给我写信
给我留言
(IP ,Since 04/28/2006 15:00)
《ASP.NET入门随想》目录
开卷有益?- 开篇
瘦子与胖子的故事 - 环境与任务
抽象的力量 - 编程思想
吸星大法 - OO思想
金庸群“粒”传 - 对象与类
大航海家 - 封装、合成与继承
主角与配角 - 多态、接口与委托
明明白白我的心 - 页面模型
宽容 - W3C的WEB标准
珍珠奶茶 - 服务器控件模型
信客 - 事件框架
代言人 - 客户端行为
检票员 - 验证器构架
版权声明:《ASP.NET入门随想》系列文章作者 老燕 已授权天极网·开发者网络http://dev.yesky.com发表,版权归作者个人所有,任何外部引用或摘抄请注明原文地址http: //oldswallow.cnblogs.com ,未经作者授权不得用于任何以营利目的的行为,谢谢合作!
《随想》系列的评论&回复
ASP.NET入门随想上天极网首页
乱想:当"爱"成为往事时
对话: 关于委托的进一步讨论
感悟: 冰火两重天
回报: 收到随想系列的稿费
评论:深知我心
评论:随想四的评论&回复
感悟:三易其稿
与我联系
发短消息
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
随笔分类
ASP.NET入门随想(13)
(rss)
评论与回复(8)
(rss)
网站运营随想
(rss)
友情链接
dudu
Fantasy Soft
NBear Project - Teddy
老燕
木头快跑
最新随笔
1. [ASP.NET入门随想十三] 检票员—— 验证器架构
2. [ASP.NET入门随想十二] 代言人—— 客户端行为
3. [ASP.NET入门随想十一] 信客—— 事件框架
4. [ASP.NET入门随想十] 珍珠奶茶 ——服务器控件模型
5. [ASP.NET入门随想九] 宽容——W3C 的Web标准(修改版)
6. [ASP.NET入门随想八]明明白白我的心——ASP.NET的页面模型
7. [ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托
8. [ASP.NET入门随想六]大航海家——OO思想的类间关系
9. [ASP.NET入门随想五]金庸群“粒”传——OO思想的对象与类
10. [ASP.NET入门随想四]吸星大法——页面的OO思想篇
最新评论
1. re: [ASP.NET入门随想十三] 检票员—— 验证器架构
楼主已经停止更新了吗
--啊啊
2. re: [ASP.NET入门随想一]开卷有益?——随想开篇
今天看了燕兄大作!三生有幸啊!
--IMART 创意市集
3. re: [ASP.NET入门随想一]开卷有益?——随想开篇
呵呵。
--求知无傲