ASP.NET入门随想之检票

2023-12-29 09:20
文章标签 入门 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所示。

转载于:https://www.cnblogs.com/ericgisser/archive/2009/12/17/net_TicketSafe.html

这篇关于ASP.NET入门随想之检票的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549067

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显