ASP.NET高级教程(五)---实战篇(结合论坛用户操作谈ASP.NET表单验证)(中)
做好准备工作,现在就要动真格的了,先让我们看看用户注册的实现。前边已经讲过,ASP.NET可以实现业务逻辑和HTML代码分离,那么让我们来看看到底是如何实现的,下面这个文件是用户注册的页面部分,原型是根据我站点的风格制作的:
<%@PAGE LANGUAGE="C#" CODEBEHIND="REGISTER.CS" AUTOEVENTWIREUP="FALSE" INHERITS="BBS.REGISTER" %> <%@REGISTER TAGPREFIX="MY" NAMESPACE="BBS.UCTRL"%> <HTML><HEAD> <TITLE>新用户注册</TITLE> <META NAME=VS_TARGETSCHEMA CONTENT="HTML 4.0"> <LINK REL="STYLESHEET" HREF="IMAGES/STYLE.CSS"> <META HTTP-EQUIV=CONTENT-TYPE CONTENT="TEXT/HTML; CHARSET=GB2312"> <META NAME="GENERATOR" CONTENT="MICROSOFT VISUAL STUDIO 7.0"> <META NAME="CODE_LANGUAGE" CONTENT="C#"></HEAD> <SCRIPT LANGUAGE=JAVASCRIPT> FUNCTION ONPREVIEW() { DIVPREVIEW.INNERHTML = FORM1.TXTSIGNATURE.VALUE ; } </SCRIPT> <BODY> <FORM METHOD="POST" RUNAT="SERVER" ID=FORM1>&NBSP;
<MY:MYHEAD ID="MYHEAD1" RUNAT="SERVER"></MY:MYHEAD>
<!----------------------外面表格形成边框--------------------------------------> <TABLE WIDTH='722' BORDER='0' CELLSPACING=0 CELLPADDING='0' ALIGN='CENTER'> <TBODY> <TR> <!-------------------左边竖线----------------------------------------------> <TD BGCOLOR='#0097C0' WIDTH='1'> <IMG SRC='IMAGES/SHIM.GIF' WIDTH=1> </TD> <TD WIDTH=720 ALIGN=MIDDLE><BR><BR><BR> <!-------------------左边竖线---------------------------------------------->
<!--------------新用户注册开始----------------------------------------------> <TABLE WIDTH=600 ALIGN=CENTER BORDER=0 CELLPADDING=4 CELLSPACING=1 ID="TBLREGISTER" CLASS=CN BGCOLOR=#000000 RUNAT=SERVER> <TBODY> <TR BGCOLOR=#FFFFFF> <TD COLSPAN=3> <P ALIGN=CENTER>新用户注册</P> </TD> </TR> <!--------------用户名开始--------------------------------------------------------> <TR BGCOLOR=#FFFFFF> <TD WIDTH=60> 用户名 </TD> <TD WIDTH=300> <ASP:TEXTBOX ID="TXTUSERNAME" MAXLENGTH=20 COLUMNS=20 RUNAT="SERVER"></ASP:TEXTBOX> <FONT COLOR=RED>*</FONT> </TD> <TD WIDTH=240> 用户笔名,4-20字符 <ASP:REQUIREDFIELDVALIDATOR ID="REQUSERNAME" DISPLAY=DYNAMIC CONTROLTOVALIDATE="TXTUSERNAME" RUNAT=SERVER> 不能为空! </ASP:REQUIREDFIELDVALIDATOR> <ASP:REGULAREXPRESSIONVALIDATOR ID="REGUSERNAME" DISPLAY=DYNAMIC CONTROLTOVALIDATE="TXTUSERNAME" RUNAT=SERVER VALIDATIONEXPRESSION="[^']{4,20}"> 用户名非法! </ASP:REGULAREXPRESSIONVALIDATOR> <ASP:CUSTOMVALIDATOR ID="CUSUSERNAME" CONTROLTOVALIDATE="TXTUSERNAME" ONSERVERVALIDATE="VALIDUSER" DISPLAY=DYNAMIC RUNAT=SERVER> 该用户已存在。 </ASP:CUSTOMVALIDATOR> </TD> </TR> <!--------------用户名结束-------------------------------------------------------->
<!--------------用户密码开始--------------------------------------------------------> <TR BGCOLOR=#FFFFFF> <TD WIDTH=60> 密码 </TD> <TD WIDTH=300> <ASP:TEXTBOX ID="TXTPASSWORD" MAXLENGTH=10 COLUMNS=10 TEXTMODE=PASSWORD RUNAT=SERVER></ASP:TEXTBOX> <FONT COLOR=RED>*</FONT> </TD> <TD WIDTH=240> 用户密码,4-10字符 <ASP:REQUIREDFIELDVALIDATOR ID=REQUIREDFIELDVALIDATOR1 DISPLAY=DYNAMIC CONTROLTOVALIDATE="TXTPASSWORD" RUNAT=SERVER> 不能为空! </ASP:REQUIREDFIELDVALIDATOR> <ASP:REGULAREXPRESSIONVALIDATOR ID=REGULAREXPRESSIONVALIDATOR1 DISPLAY=DYNAMIC CONTROLTOVALIDATE="TXTPASSWORD" RUNAT=SERVER VALIDATIONEXPRESSION="[^']{4,10}"> 密码非法! </ASP:REGULAREXPRESSIONVALIDATOR> </TD> </TR> <!--------------用户密码结束--------------------------------------------------------> <!--------------验证密码开始--------------------------------------------------------> <TR BGCOLOR=#FFFFFF> <TD WIDTH=60> 验证密码 </TD> <TD WIDTH=300> <ASP:TEXTBOX ID=TXTPASSWORD1 MAXLENGTH=10 COLUMNS=10 TEXTMODE=PASSWORD RUNAT=SERVER></ASP:TEXTBOX> <FONT COLOR=RED>*</FONT> </TD> <TD WIDTH=240> 再次输入密码。 <ASP:COMPAREVALIDATOR ID="COMPASSWORD" DISPLAY=DYNAMIC CONTROLTOCOMPARE="TXTPASSWORD" CONTROLTOVALIDATE="TXTPASSWORD1" RUNAT=SERVER> 两次录入的密码不同! </ASP:COMPAREVALIDATOR> </TD> </TR> <!--------------验证密码结束-------------------------------------------------------->
<!--------------EMAIL开始--------------------------------------------------------> <TR BGCOLOR=#FFFFFF> <TD WIDTH=60> EMAIL </TD> <TD WIDTH=300> <ASP:TEXTBOX ID="TXTEMAIL" MAXLENGTH=100 COLUMNS=30 RUNAT=SERVER></ASP:TEXTBOX> </TD> <TD WIDTH=240> 您的电子邮件地址,您可以不填,但请不要胡填。 <ASP:REGULAREXPRESSIONVALIDATOR ID="REGEMAIL" DISPLAY=DYNAMIC CONTROLTOVALIDATE="TXTEMAIL" VALIDATIONEXPRESSION="[^']*" RUNAT=SERVER> 非法字符 </ASP:REGULAREXPRESSIONVALIDATOR> </TD> </TR> <!--------------EMAIL结束-------------------------------------------------------->
<!--------------个人主页开始--------------------------------------------------------> <TR BGCOLOR=#FFFFFF> <TD WIDTH=60> 个人主页 </TD> <TD WIDTH=300> <ASP:TEXTBOX ID="TXTHOMEPAGE" MAXLENGTH=150 COLUMNS=30 RUNAT=SERVER></ASP:TEXTBOX> </TD> <TD WIDTH=240> 您的主页,您可以不填,但请不要胡填。 <ASP:REGULAREXPRESSIONVALIDATOR ID="REGHOMEPAGE" DISPLAY=DYNAMIC CONTROLTOVALIDATE="TXTHOMEPAGE" VALIDATIONEXPRESSION="[^']*" RUNAT=SERVER> 非法字符。 </ASP:REGULAREXPRESSIONVALIDATOR> </TD> </TR> <!--------------个人主页结束-------------------------------------------------------->
<!--------------签名开始--------------------------------------------------------> <TR BGCOLOR=#FFFFFF> <TD WIDTH=60> 签名 </TD> <TD WIDTH=300> <ASP:TEXTBOX ID="TXTSIGNATURE" MAXLENGTH=150 COLUMNS=30 ROWS=6 TEXTMODE=MULTILINE RUNAT=SERVER></ASP:TEXTBOX> </TD> <TD WIDTH=240 VALIGN=TOP> <DIV ID="DIVPREVIEW"> 你可以制作自己的签名,不超过255个字符,不能用SCRIPT。<BR><BR> </DIV><BR> <INPUT TYPE=BUTTON ID="BTNPREVIEW" VALUE="预览" ONCLICK="ONPREVIEW()"><BR> <ASP:REGULAREXPRESSIONVALIDATOR ID=REGULAREXPRESSIONVALIDATOR2 DISPLAY=DYNAMIC CONTROLTOVALIDATE="TXTSIGNATURE" VALIDATIONEXPRESSION="[^']{0,255}" RUNAT=SERVER> 使用非法字符或超过255个字符。 </ASP:REGULAREXPRESSIONVALIDATOR> </TD> </TR> <!--------------签名结束--------------------------------------------------------> <TR BGCOLOR=#FFFFFF> <TD COLSPAN=3 ALIGN=CENTER> <ASP:BUTTON ID="BTNSUBMIT" TEXT="确认" ONCLICK="ONSUBMIT" RUNAT=SERVER></ASP:BUTTON> </TD> </TR> </TABLE><BR><BR><BR> <!----------------------------------新用户注册结束---------------------->
<!-------------------右边竖线----------------------------------------------> <TD BGCOLOR='#0097C0' WIDTH='1'> <IMG SRC='IMAGES/SHIM.GIF' WIDTH=1> </TD> <!-------------------右边竖线----------------------------------------------> </TR> <!-------------------下边横线----------------------------------------------> <TR> <TD COLSPAN=3 HEIGHT=1 BGCOLOR=#0097C0><IMG SRC='IMAGES/SHIM.GIF'WIDTH=1 HEIGHT=1></TD> </TR> <!-------------------下边横线----------------------------------------------> </TABLE>
<MY:BOTTOM ID="MYBOTTOM" RUNAT="SERVER"></MY:BOTTOM> </FORM> </BODY></HTML>
<!--------------------文件结束--------------------------------->
怎么样,看上去很熟悉吧,除了页首两句及下面WEBFORM中带RUNAT=SERVER的WEBCONTROL,是不是和普通的HTML一样?注意到页首第一句中的CODEBEHIND="REGISTER.CS"吗,它指定本页后面的代码文件是REGISTER.CS,这是ASP.NET提供的一种机制,它可以将业务逻辑隐藏在与.ASPX同名的CS文件中,而运行时先把这个CS文件编译,这样不但可以提高运行效率,也使代码隐藏起来,避免了ASP中由于系统漏洞而造成源码泄漏所造成的问题。那么,这个包含业务逻辑的代码文件是怎样的呢?下面是这个文件: NAMESPACE BBS { USING SYSTEM; USING SYSTEM.COLLECTIONS; USING SYSTEM.COMPONENTMODEL; USING SYSTEM.DATA.SQL; USING SYSTEM.DRAWING; USING SYSTEM.WEB; USING SYSTEM.WEB.SESSIONSTATE; USING SYSTEM.WEB.UI; USING SYSTEM.WEB.UI.WEBCONTROLS; USING SYSTEM.WEB.UI.HTMLCONTROLS; USING BBS.UCTRL ; //USING BBS.MYCLASS ; USING MYOWNCLASS ;
/// <SUMMARY> /// SUMMARY DESCRIPTION FOR REGISTER. /// </SUMMARY> PUBLIC CLASS REGISTER : SYSTEM.WEB.UI.PAGE { PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.BUTTON BTNSUBMIT; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.TEXTBOX TXTHOMEPAGE; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.TEXTBOX TXTEMAIL; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.COMPAREVALIDATOR COMPASSWORD; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.TEXTBOX TXTPASSWORD1; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.REGULAREXPRESSIONVALIDATOR REGULAREXPRESSIONVALIDATOR1; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.REQUIREDFIELDVALIDATOR REQUIREDFIELDVALIDATOR1; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.TEXTBOX TXTPASSWORD; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.CUSTOMVALIDATOR CUSUSERNAME; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.REGULAREXPRESSIONVALIDATOR REGUSERNAME; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.REQUIREDFIELDVALIDATOR REQUSERNAME; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.LABEL LBLMESSAGE; PROTECTED SYSTEM.WEB.UI.WEBCONTROLS.TEXTBOX TXTUSERNAME; PUBLIC MYHEAD MYHEAD1 ;
//构造函数 PUBLIC REGISTER() { PAGE.INIT += NEW SYSTEM.EVENTHANDLER(PAGE_INIT); }
PROTECTED VOID PAGE_LOAD(OBJECT SENDER, EVENTARGS E) { IF (!ISPOSTBACK) { // // EVALS TRUE FIRST TIME BROWSER HITS THE PAGE // } }
PROTECTED VOID PAGE_INIT(OBJECT SENDER, EVENTARGS E) { // // CODEGEN: THIS CALL IS REQUIRED BY THE ASP+ WINDOWS FORM DESIGNER. // INITIALIZECOMPONENT(); THIS.MYHEAD1.POSITION = 2 ; }
/// <SUMMARY> /// REQUIRED METHOD FOR DESIGNER SUPPORT - DO NOT MODIFY /// THE CONTENTS OF THIS METHOD WITH THE CODE EDITOR. /// </SUMMARY> PRIVATE VOID INITIALIZECOMPONENT() { THIS.LOAD += NEW SYSTEM.EVENTHANDLER (THIS.PAGE_LOAD); }
//监测用户是否存在 PUBLIC BOOL VALIDUSER(OBJECT SENDER , STRING VALUE) { BBSUSER MYUSER = NEW BBSUSER() ; BOOL BEXISTS ; TRY { BEXISTS = MYUSER.GETUSER(THIS.TXTUSERNAME.TEXT) ; } CATCH(EXCEPTION E) //如果出现异常 { #IF DEBUG RESPONSE.WRITE (E.MESSAGE) ; RETURN FALSE ; #ENDIF SERVER.TRANSFER("ERROR.ASPX") ; } RETURN !BEXISTS ; }
//提交按钮点击 PUBLIC VOID ONSUBMIT(OBJECT SENDER , EVENTARGS E) { IF (PAGE.ISVALID) { //数据入库 TRY { BBSUSER MYUSER = NEW BBSUSER() ; IF(!MYUSER.GETUSER(TXTUSERNAME.TEXT)) { MYUSER.CREATEUSER(BBSUSER.CREATETYPE.CREATE , TXTUSERNAME.TEXT , TXTPASSWORD.TEXT , TXTEMAIL.TEXT , TXTHOMEPAGE.TEXT , "") ; } } CATCH(EXCEPTION EXP) { #IF DEBUG RESPONSE.WRITE ("出现异常:" + EXP.MESSAGE) ; RETURN ; #ENDIF//DEBUG SERVER.TRANSFER("ERROR.ASPX") ; } } }
}
}
什么?还是看着眼熟?没错,是不是和前边我定义的那个类差不多?是,本来ASP.NET就是把这个页当作一个对象,注意类定义的那行代码:PUBLIC CLASS REGISTER : SYSTEM.WEB.UI.PAGE , 前面你可以理解,是定义一个REGISTER对象,那:号后面的SYSTEM.WEB.UI.PAGE是什么意思呢?它说明这个REGSITER类是SYSTEM.WEB.UI.PAGE类的派生类(子类),也就是说REGISTER类除了自己成员变量、属性、方法外,还继承SYSTEM.WEB.UI.PAGE类的所有公共(PUBLIC)或保护(PROTECTED)成员变量、属性和方法。明白了这些,你可以安心坐下来研究代码了,做好下面关于表单验证内容的学习准备。
|