浅谈在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)))(/|-|.)(:021(: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]|1D|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;
}