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

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;
}

时间: 2024-08-03 20:43:48

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

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

asp.net|数据     作为一名程序员,一定要对自己编写的程序的健壮性负责,因此数据的校验无论在商业逻辑还是系统实现都是必不可少的部分.     我这里总结了一种自认为比较不错的asp.net(C#)的数据校验方法,如大家探讨.     主要用Regex的IsMatch方法,在BusinessRule层进行校验数据的有效性,并将校验的方法作为BusinessRule层基类的一部分. 在WebUI层现实提示信息. using System;using System.Data;using Sy

浅谈js在html中的加载执行顺序,多个jquery ready执行顺序_javascript技巧

jQuery $(document).ready()执行顺序: 当页面DOM 元素全部加载完毕后就执行.ready().$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 如果在.ready()执行之前有javascript代码存在,那么javascript将怎么执行呢? 答案是先执行.ready()之前的javascript代码,然后执行.ready(). 多个$(document).ready()的执行顺序并非单纯的顺序执行,其与嵌套层级也有一定的关系.

浅谈在JAVA项目中LOG4J的使用_java

一.直接使用: //输出到项目文件夹下output1.txt文件中 ////////////////////////////// // DEBUG - Here is some DEBUG // INFO - Here is some INFO // WARN - Here is some WARN // ERROR - Here is some ERROR // FATAL - Here is some FATAL ////////////////////////////// package

浅谈redis在项目中的应用_Redis

redis在项目中的应用 ps:PHP 会自动 关redis连接 不需要手动关 对于临时的数据 可以不经过数据库直接redis上操作 /*消息队列实例 */ public function insertinfo(){ //连接本地的 Redis 服务 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); //存储数据到列表中 $infos = array('info1' => 66, 'info2' => 88); $red

浅谈PHP检查数组中是否存在某个值 in_array 函数_php实例

PHP in_array() 函数检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE . 语法: bool in_array( mixed needle, array array [, bool strict] ) 参数说明: 参数 说明 needle 需要在数组中搜索的值,如果是字符串,则区分大小写 array 需要检索的数组 strict 可选,如果设置为 TRUE ,则还会对 needle 与 array 中的值类型进行检查 例子: <?php $arr_a = a

浅谈Java的String中的subString()方法_java

方法如下: public String substring(int beginIndex, int endIndex) 第一个int为开始的索引,对应String数字中的开始位置, 第二个是截止的索引位置,对应String中的结束位置 1.取得的字符串长度为:endIndex - beginIndex; 2.从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符 如: "hamburger".substring(4, 8) returns

浅谈s:select 标签中list存放map对象的使用_java

1.XXXAction.java private List<Map<String, String>> maptest = null; public List<Map<String, String>> getMaptest() { return maptest; } public void setMaptest(List<Map<String, String>> maptest) { this.maptest = maptest; }

浅谈PHP检查数组中是否存在某个值 in_array 函数

PHP in_array() 函数检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE . 语法: bool in_array( mixed needle, array array [, bool strict] ) 参数说明: 参数 说明 needle 需要在数组中搜索的值,如果是字符串,则区分大小写 array 需要检索的数组 strict 可选,如果设置为 TRUE ,则还会对 needle 与 array 中的值类型进行检查 例子: <?php $arr_a = a

浅谈几种常用的JS类定义方法_javascript技巧

// 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : function(v) { this.v1 = v; } }; // 方法2 定义函数对象 var Obj = function() { var v1 = ""; this.get_v1 = function() { return this.v1; }; this.set_v1 = function