作为一名程序员,一定要对自己编写的程序的健壮性负责,因此数据的校验无论在商业逻辑还是系统实现都是必不可少的部分。
我这里总结了一种自认为比较不错的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;
}