您的位置:首页精文荟萃软件资讯 → 浅谈在ASP.NET中数据有效性校验的方法

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

时间:2004/10/8 13:15:00来源:本站整理作者:蓝点我要评论(0)

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

 

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

 

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

 

在WebUI层现实提示信息。

 

using System;
using System.Data;
using System.Text.RegularExpressions;
namespace Education.BusinessRules
{
 ///


 /// 商业规则层的基类
 ///


 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中使用校验的方法
  ///


  /// 使用上面的方法对数据进行有效性校验
  ///


  ///

数据行
  ///

通过--true 不通过--false

 
  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中显示错误提示信息
///


/// 显示提交数据返回的错误信息
///


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 += "

"  + tmpfieldErrors + "
";
  }
 }
 //显示错误信息
 this.lblError.Text = fieldErrors;
}

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本