当前位置: 首页 > 编程日记 > 正文

浅谈在ASP.NET中数据有效性校验的方法

作者:未知

作为一名程序员,一定要对自己编写的程序的健壮性负责,因此数据的校验无论在商业逻辑还是系统实现都是必不可少的部分。

我这里总结了一种自认为比较不错的asp.net(C#)的数据校验方法,如大家探讨。

主要用Regex的IsMatch方法,在BusinessRule层进行校验数据的有效性,并将校验的方法作为BusinessRule层基类的一部分。

在WebUI层现实提示信息。

using System;
using System.Data;
using System.Text.RegularExpressions;
namespace Education.BusinessRules
{
/// <summary>
/// 商业规则层的基类
/// </summary>
public class BizObject
{
public const String REGEXP_IS_VALID_EMAIL = @"^/w+((-/w+)|(/./w+))*/@/w+((/.|-)/w+)*/./w+$"; //电子邮件校验常量
public const String REGEXP_IS_VALID_URL = @"^http://([/w-]+/.)+[/w-]+(/[/w- ./?%&=]*)?"; //网址校验常量
public const String REGEXP_IS_VALID_ZIP = @"/d{6}"; //邮编校验常量
public const String REGEXP_IS_VALID_SSN = @"/d{18}|/d{15}"; //身份证校验常量
public const String REGEXP_IS_VALID_INT = @"^/d{1,}$"; //整数校验常量
public const String REGEXP_IS_VALID_DEMICAL = @"^-?(0|/d+)(/./d+)?$"; //数值校验常量 "
//日期校验常量
public const String REGEXP_IS_VALID_DATE = @"^(?:(?:(?:(?:1[6-9]|[2-9]/d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(//|-|/.)(?:0?2/1(?:29))$)|(?:(?:1[6-9]|[2-9]/d)?/d{2})(//|-|/.)(?:(?:(?:0?[13578]|1[02])/2(?:31))|(?:(?:0?[1,3-9]|1[0-2])/2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))/2(?:0?[1-9]|1/d|2[0-8]))$";

public BizObject(){}

#region 校验字段是否为空 或 字段长度超长 方法

public string GetFieldTooLongError(string ErrorField,int maxlen)
{
return ErrorField + "信息超长,请删减至" + maxlen.ToString() + "个字符!" ;
}

public string GetFieldNullError(string ErrorField)
{
return ErrorField + "是必填项,不允许为空!" ;
}

public bool IsValidField(DataRow Row, String fieldName, int maxLen,string ErrorField ,bool AllowNull)
{
int i = (short)(Row[fieldName].ToString().Trim().Length);

if ( i < 1 && (!AllowNull))
{
Row.SetColumnError(fieldName, GetFieldNullError(ErrorField));
return false;
}
else if (i > maxLen )
{
Row.SetColumnError(fieldName, GetFieldTooLongError(ErrorField,maxLen));
return false;
}
return true;
}
#endregion

#region 校验 电子邮件 类型字段格式 方法

public string GetEmailFieldError(string ErrorField)
{
return ErrorField + "格式不正确(a@b.c)!" ;
}
public bool IsValidEmail(DataRow Row, String fieldName,int maxLen ,string ErrorField,bool AllowNull)
{
int i = (short)(Row[fieldName].ToString().Trim().Length);

bool isValid = IsValidField(Row,fieldName, maxLen , ErrorField , AllowNull);

if ( isValid )
{
isValid = (new Regex(REGEXP_IS_VALID_EMAIL)).IsMatch(Row[fieldName].ToString());

if ( (!isValid) && (i > 0))
{
Row.SetColumnError(fieldName, GetEmailFieldError(ErrorField));
return false;
}
}
return true;
}
#endregion

#region 校验 邮编 类型字段格式 方法

public string GetZipFieldError(string ErrorField)
{
return ErrorField + "格式不正确(157032)!" ;
}
public bool IsValidZip(DataRow Row, String fieldName,int maxLen ,string ErrorField,bool AllowNull)
{
int i = (short)(Row[fieldName].ToString().Trim().Length);

bool isValid = IsValidField(Row,fieldName, maxLen , ErrorField , AllowNull);

if ( isValid )
{
isValid = (new Regex(REGEXP_IS_VALID_ZIP)).IsMatch(Row[fieldName].ToString());

if ( (!isValid) && (i > 0))
{
Row.SetColumnError(fieldName, GetZipFieldError(ErrorField));
return false;
}
}
return true;
}
#endregion

#region 校验 身份证 类型字段格式 方法

public string GetSSNFieldError(string ErrorField)
{
return ErrorField + "格式不正确(长度为15或18位)!" ;
}
public bool IsValidSSN(DataRow Row, String fieldName,int maxLen ,string ErrorField,bool AllowNull)
{
int i = (short)(Row[fieldName].ToString().Trim().Length);

bool isValid = IsValidField(Row,fieldName, maxLen , ErrorField , AllowNull);

if ( isValid )
{
isValid = (new Regex(REGEXP_IS_VALID_SSN)).IsMatch(Row[fieldName].ToString());

if ( (!isValid) && (i > 0))
{
Row.SetColumnError(fieldName, GetSSNFieldError(ErrorField));
return false;
}
}
return true;
}
#endregion

#region 校验 网址 类型字段格式 方法

public string GetUrlFieldError(string ErrorField)
{
return ErrorField + "格式不正确(http://www.abc.com)!" ;
}
public bool IsValidUrl(DataRow Row, String fieldName,int maxLen ,string ErrorField,bool AllowNull)
{
int i = (short)(Row[fieldName].ToString().Trim().Length);

bool isValid = IsValidField(Row,fieldName, maxLen , ErrorField , AllowNull);

if ( isValid )
{
isValid = (new Regex(REGEXP_IS_VALID_URL)).IsMatch(Row[fieldName].ToString());

if ( (!isValid) && (i > 0))
{
Row.SetColumnError(fieldName, GetUrlFieldError(ErrorField));
return false;
}
}
return true;
}
#endregion

#region 校验 日期 类型字段格式 方法

public string GetDateFieldError(string ErrorField)
{
return ErrorField + "日期格式不正确!" ;
}
public bool IsValidDate(DataRow Row, String fieldName,int maxLen ,string ErrorField,bool AllowNull)
{
int i = (short)(Row[fieldName].ToString().Trim().Length);

bool isValid = IsValidField(Row,fieldName, maxLen , ErrorField , AllowNull);

if ( isValid )
{
isValid = (new Regex(REGEXP_IS_VALID_DATE)).IsMatch(Row[fieldName].ToString());

if ( (!isValid) && (i > 0))
{
Row.SetColumnError(fieldName, GetDateFieldError(ErrorField));
return false;
}
}
return true;
}
#endregion

#region 校验 数值 类型字段格式 方法
//这也是个判断数值的办法
private bool IsNumeric(string Value)
{
try
{
int i = int.Parse(Value);
return true;
}
catch
{ return false; }
}

public string GetFieldNumberError(string ErrorField)
{
return ErrorField + "必须是数字(例如:90)!" ;
}

public bool IsValidNumber(DataRow Row, String fieldName,string ErrorField,bool AllowNull)
{
int i = (short)(Row[fieldName].ToString().Trim().Length);

bool isValid = (new Regex(REGEXP_IS_VALID_DEMICAL)).IsMatch(Row[fieldName].ToString());

if ( i < 1 && (!AllowNull))
{
Row.SetColumnError(fieldName, GetFieldNullError(ErrorField));
return false;
}
else if ( (!isValid) && (i > 0))
{
Row.SetColumnError(fieldName, GetFieldNumberError(ErrorField));
return false;
}
return true;
}
#endregion

}
}



//在继承了基类的BusinessRule中使用校验的方法
/// <summary>
/// 使用上面的方法对数据进行有效性校验
/// </summary>
/// <param name="Row">数据行</param>
/// <returns>通过--true 不通过--false</returns>
public bool Validate(DataRow Row)
{
bool isValid;
Row.ClearErrors();
isValid = IsValidField(Row, "name", 20 ,"姓名",false);
isValid &= IsValidZip(Row, "zip", 6,"邮编",true);
isValid &= IsValidNumber(Row, "age","年龄",false);
isValid &= IsValidEmail(Row,"email",50,"电子邮件" ,true);
return isValid;
}



//在WebUI中显示错误提示信息
/// <summary>
/// 显示提交数据返回的错误信息
/// </summary>
private void DisplayErrors()
{
String fieldErrors="";
String tmpfieldErrors="";

DataRow Row = ds.Tables[0].Rows[0];

foreach (DataColumn Column in ds.Tables[0].Columns)
{
tmpfieldErrors = Row.GetColumnError(Column.ColumnName.ToString());
if (tmpfieldErrors!="")
{
fieldErrors += "<li>" + tmpfieldErrors + "<br>";
}
}
//显示错误信息
this.lblError.Text = fieldErrors;
}

相关文章:

关于Python 3.9,那些你不知道的事

作者 | Ayushi Rawat编译 | 高卫华题图 | 视觉中国Python一直在满足社区需求&#xff0c;并且将成为未来使用最多的语言。Python的下一个版本带来了更快速的进程释放&#xff0c;性能的提升&#xff0c;简便的新字符串函数&#xff0c;字典并集运算符以及更兼容稳定的内部API。…

memcache缓存失效

缓存过期 memcached在处理过期的缓存项时&#xff0c;采用懒惰模式处理方法。 缓存项过期&#xff0c;不会立即删除&#xff0c;直到对该缓存项执行了get操作&#xff0c;才会删除过期缓存。> set key 0 10 > test > stats //查看curr_items的值 > get key //超过过…

ASP.NET HTTP 运行时

ASP.NET HTTP 运行时一个请求从 URL 字符串到 HTML 代码的“漫长曲折”之路 Dino EspositoWintellect 2003年7月10日 摘要&#xff1a;本文详细介绍了 HTTP 运行时的组成部分&#xff0c;以及在处理对 ASP.NET 应用程序的各种请求时采用的逻辑。文章还以 Web Garden 模型和最新…

C++中的const关键字(zz)

【补充】mutable关键字有时我们希望类的数据成员即使在const成员函数中&#xff0c;依然是可以修改的&#xff0c;这时就可以把它们声明为mutable来实现。这样的应用&#xff0c;比如记录各种操作的调用次数&#xff0c;这时&#xff0c;即使在const中&#xff0c;依然要修改计…

Python让你成为AI 绘画大师,简直太惊艳了!(附代码))

作者 | 李秋键责编 | 李雪敬头图 | CSDN下载自视觉中国引言&#xff1a;基于前段时间我在CSDN上创作的文章“CylcleGAN人脸转卡通图”的不足&#xff0c;今天给大家分享一个更加完美的绘制卡通的项目“Learning to Cartoonize Using White-box Cartoon Representations”。首先…

Vue 2 | Part 4 v-bind绑定元素属性和样式

这期跟大家分享的&#xff0c;是v-bind指令。它可以往元素的属性中绑定数据&#xff0c;也可以动态地根据数据为元素绑定不同的样式。 绑定属性 最简单的例子&#xff0c;我们有一张图片&#xff0c;需要定义图片的src。我们可以直接在元素的属性里面定义&#xff1a; <div …

在 ASP.NET 中执行 URL 重写

在 ASP.NET 中执行 URL 重写 发布日期&#xff1a; 8/23/2004| 更新日期&#xff1a; 8/23/2004Scott Mitchell 4GuysFromRolla.com 适用范围&#xff1a; Microsoft ASP.NET 摘要&#xff1a;介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写。URL 重写是截取传入 Web 请求并…

win8中使用BitLocker加密

一、加密驱动器二、管理三、TPM转载于:https://blog.51cto.com/jimshu/989359

​清华硕士爆料:这些才是机器学习必备的数学基础

现如今&#xff0c;计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章&#xff0c;还是要参与相关任务&#xff0c;你马上就会遇到一些拦路虎&#xff1a;想过滤垃圾邮件&#xff0c;不具备概率论中的贝叶斯思维恐怕不行&#xff1b;想试…

Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站

Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站

用C#对ADO.NET数据库完成简单操作

作者&#xff1a;李阳 http://oraasp.vicp.net/article/article.aspx?ID21 数据库访问是程序中应用最普遍的部分。随着C#和ADO.NET的引入&#xff0c;这种操作变得更简单。这篇文章将示范四种最基础的数据库操作。 ● 读取数据。其中包括多种数据类型&#xff1a;整型&#…

用createrepo配置Yum本地源

yum配置本地源, 在网速差的情况下&#xff0c;yum用在线源是一件头痛的事&#xff0c;所以以下为yum的本地源配置可以有好解决这个事。 1,安装createrepo包&#xff0c; 可以用yum安装(yum install createrepo -y); 也可以安装rpm或tar包 &#xff08;网址&#xff1a;createre…

首次在手机端不牺牲准确率实现BERT实时推理,比TensorFlow-Lite快近8倍,每帧只需45ms...

作者 | 王言治 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 基于Transformer的预训练模型在许多自然语言处理&#xff08;NLP&#xff09;任务中取得了很高的准确度。但是这些预训练模型往往需要很大的计算量和内存。由于移动平台的存储空间以及计算能力的限制&a…

[svc]caffe安装笔记-显卡购买

caffe,这是是数据组需要做一些大数据模型的训练(深度学习), 要求 服务器显卡(运算卡), 刚开始老板让买的牌子是泰坦的(这是2年前的事情了). 后来买不到这个牌子的,(jd,tb)看过丽台的,看过gtx系列的哪个型号来着, 也不合适,后来买的特斯拉显卡 [查了下一些知名的显卡牌子](https…

AABO:自适应最优化Anchor设置,性能榨取的最后一步 | ECCV 2020

编译 | VincentLee来源 | 晓飞的算法工程笔记Introduction目前&#xff0c;主流的目标检测算法使用多种形状的anchor box作为初始预测&#xff0c;然后对anchor box进行回归调整&#xff0c;anchor box的配置是检测算法中十分重要的超参数。一般而言&#xff0c;anchor box的配…

Android列表控件选项中添加进度框ProgressBar实现

今天有时间就学习了下在ListView、GridView列表项中清加ProgressBar,小马用最简单的代码实现可以通用的功能&#xff0c;人人都能看懂&#xff0c;哈哈&#xff0c;直接说下&#xff0c;如果你的适配器getView方法返回的View是一个自定义控件的话&#xff0c;有点不好实现哦&am…

写一个通用数据访问组件

出处&#xff1a;http://www.csharp-corner.com willsound&#xff08;翻译&#xff09; 我收到过好多Email来问我如何用一个通用的数据提供者(data provider)在不失自然数据提供者(native data provider)稳定而强大功能的前提下来访问不同的数据源(data sources).一个小伙子…

InstallShield 2015 LimitedEdition VS2012 运行bat文件

转载:http://www.cnblogs.com/fengwenit/p/4271150.html 运行bat文件 网上很多介绍如何运行bat的方法&#xff0c;但我这个是limted 版本&#xff0c;不适用。 1. 打开 Define Setup Requirements and Actions –> Custom Actions 2. 右健 After Register Product –> Ne…

理解C#中的string类型

作者&#xff1a;未知目的 本文的目的在于揭示和DOTNET及C#相关的一些常见的和不常见的问题。在这些问题中我的第一篇文章和string数据类型有关,string数据类型是一种引用类型,但是当和其他引用类型比较的时候,很多开发人员可能并不能完全理解它的行为。 问题 对于常见的引用类…

最全总结!聊聊 Python 操作PDF的几种方法

作者 | 陈熹来源 | 早起Python前言本文主要涉及&#xff1a;os 模块综合应用glob 模块综合应用PyPDF2 模块操作基本操作PyPDF2 导入模块的代码常常是&#xff1a;from PyPDF2 import PdfFileReader, PdfFileWriter这里导入了两个方法&#xff1a;PdfFileReader 可以理解为读取器…

three.js(六) 地形法向量生成

2019独角兽企业重金招聘Python工程师标准>>> 上一节采用 分形算法生成地形的高度值&#xff0c; 接着我们需要生成每个顶点的法向量。 three.js 的PlaneGeometry 自带有法向量&#xff0c; 法向量分为两种 即 平面法向量 和 平面每个定点法向量。 因此一个n*n 块组成…

ASP.NET中使用多个runat=server form

作者&#xff1a;未知ASP.NET 在同一个页面不支持多个 runatserver forms&#xff0c;要解决这个问题&#xff0c;可以把每个 form 放在一个单独的 panel 控件中&#xff0c;这样用户就可以简单地通过单选按钮在不同 panel 间切换。代码如下&#xff1a;2FormExample.aspx<%…

激发企业大“智慧” | 深度赋能AI全场景 揭秘你不知道的移动云

2020年是人工智能技术发展的关键年。疫情之下&#xff0c;世界见证了人工智能在抗击疫情中发挥的积极作用&#xff1b;今年4月&#xff0c;国家发改委正式将人工智能确定为新基建的重要领域之一。在历史机遇下&#xff0c;AI已实现"质变和量变"&#xff0c;正迈入与技…

ExtJS 4.x 得到资源树上任意的节点对象

上半年做ExtJS 4.x 的时候&#xff0c;遇到过对资源树操作的情况&#xff1a; Ext.tree.Panel 如下图&#xff1a;目的&#xff1a; 直接根据每个节点的{任意key : 对应value}&#xff0c;就能找到匹配的节点对象 代码如下&#xff1a; refs : [ { selector : rtree, …

【转载】mysql常用函数汇总

转载地址&#xff1a;http://www.jb51.net/article/40179.htm 一、数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制&#xff08;OCT返回八进制&#xff0c;HEX返回十六进制&#xff09;CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e&#xff08;自然对数的底&…

有关java的一些话

2019独角兽企业重金招聘Python工程师标准>>> 跟着做完TankWar&#xff0c;java才算是入门了&#xff0c;真正学习java从看尚学堂马士兵老师的视频开始&#xff0c;至今三个月已过&#xff0c;感谢马老师的精彩讲解&#xff0c;您才是我真正的java入门老师&#xff0…

ADO.NET 2.0中的SqlCommand.ExecutePageReader

http://blog.joycode.com/liuhuimiao/在.NET 2.0 PDC或Beta1中&#xff0c;可以看到SqlCommand对象新增了个ExecutePageReader方法&#xff0c;该方法实现了分页读取数据的功能。对于分页读取数据&#xff0c;在ADO.NET1.1中&#xff08;当然2.0也适合&#xff09;一般常用动态…

组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战

来源 | MyEncyclopedia上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法&#xff0c;通过不断自我对弈&#xff0c;最终实现从零棋力开始训练直至能够打败任何高手。在本篇中&#xff0c;我们在已有的N子棋OpenAI Gym 环境中用Pytorch实现一个简化版的AlphaGo Zero算法…

2020职场人裸辞三大原因:不开心、工资低、没有盼头

近期&#xff0c;脉脉发布了《2020职场人裸辞现状调研报道》&#xff0c;报道显示2020最让职场人想裸辞的三大原因为&#xff1a;不开心、工资低、没有盼头。报告数据中还显示&#xff0c;工资不满预期是最让人想要裸辞的主要原因&#xff0c;但有超过6成职场人表示&#xff0c…

Oracle PL/SQL编程学习笔记:Merge方法的使用

Oracle11g的Merge很强大&#xff01; 1 create or replace procedure BRANCE_REPORT_MERGE is2 3 begin4 Merge into BRANCHREPORT desttable5 using TEMP_BRANCHREPORT tmptable6 on (desttable.SENDER_IDtmptable.SENDER_ID and desttable.BRANCH_IDtmptable.BRANCH_ID…