上次的内容说过ASP.NET和ASP的最大区别在于编程思维的转换,那么我们现在就来看看如何转换编程思想。以前的WEB编程从CGI(PERL)到ASP,PHP,JSP的编程过程都是这样:美工人员给出页面原型,编程人员照页面填空,最后堆起来算完,下次如果原型变动,那么就再修改程序,这样业务逻辑和HTML页面混在一起,可以说是事倍功半。那么,现在有了ASP.NET,我们应该怎么做呢?
让我们找个实际的例子,就拿论坛来说吧,先从顶至下看看它的业务逻辑。我们可以把一个论坛视做一个对象,它有自己的属性和方法,常见的属性有名称、贴子数、用户数、版面数等等,这样的话,我们就可以这样来构造论坛对象:
NAMESPACE MYOWNCLASS { USING SYSTEM; USING SYSTEM.DATA.SQL ; USING SYSTEM.DATA ; //////////////////////////////////////////////////////////////////// // // CLASS NAME : BBS // // DESCRIPTION: 论坛类,构造一个论坛对象 // // DATE: 2000/02/03 // /// //////////////////////////////////////////////////////////////// PUBLIC CLASS BBS { //私有变量 PRIVATE STRING M_STRTITLE ; //BBS名称 PRIVATE INT M_INTFORUMCOUNT ; //版面数 PRIVATE INT M_INTTOPICCOUNT ; //贴子数 PRIVATE INT M_INTUSERCOUNT ; //注册用户数 //属性 PUBLIC STRING TITLE { GET { RETURN M_STRTITLE ; } }
PUBLIC INT FORUMCOUNT { GET { RETURN M_INTFORUMCOUNT ; } }
PUBLIC INT TOPICCOUNT { GET { RETURN M_INTTOPICCOUNT ; } }
PUBLIC INT USERCOUNT { GET { RETURN M_INTUSERCOUNT ; } }
//构造函数 PUBLIC BBS(STRING A_STRTITLE) { // // TODO: ADD CONSTRUCTOR LOGIC HERE // M_STRTITLE = A_STRTITLE ;
//读取数据库 MYCONNECTION MYCONN = NEW MYCONNECTION() ; SQLCOMMAND MYCOMMAND = NEW SQLCOMMAND() ; MYCOMMAND.ACTIVECONNECTION = MYCONN ; MYCOMMAND.COMMANDTEXT = "UP_GETBBSINFO" ; //调用存储过程 MYCOMMAND.COMMANDTYPE = COMMANDTYPE.STOREDPROCEDURE ;
TRY { MYCONN.OPEN() ; SQLDATAREADER MYREADER ; MYCOMMAND.EXECUTE(OUT MYREADER) ; IF (MYREADER.READ()) { M_INTFORUMCOUNT = (INT)MYREADER["FORUMCOUNT"] ; M_INTTOPICCOUNT = (INT)MYREADER["TOPICCOUNT"] ; M_INTUSERCOUNT = (INT)MYREADER["USERCOUNT"] ; } ELSE { THROW(NEW EXCEPTION("表或存储过程不存在")) ; }
//清场 MYREADER.CLOSE(); MYCONN.CLOSE() ; } CATCH(SQLEXCEPTION E) { THROW(NEW EXCEPTION("数据库出错:" + E.MESSAGE)) ; }
} } }
这个BBS类很简单,有四个私有变量,对应四个只读属性,方法只有一个带参数的构造函数,作用是从数据库中读取相应的数据,填充四个私有变量。类构造好了,让我们看看如何使用,在需要显示论坛这些属性的页面文件里(.ASPX)里,构造四个LABEL,象这样: <TABLE WIDTH=140 CELLPADDING=4 CELLSPACING=1 BORDER=0> <TR> <TD CLASS=CN> <FONT COLOR=WHITE>注册用户数:</FONT> </TD> <TD> <ASP:LABEL ID="LBLUSERCOUNT" RUNAT=SERVER CLASS=CN></ASP:LABEL> </TD> </TR> <TR> <TD CLASS=CN> <FONT COLOR=WHITE>贴子总数:</FONT> </TD> <TD> <ASP:LABEL ID="LBLTOPICCOUNT" RUNAT=SERVER CLASS=CN></ASP:LABEL> </TD> </TR> <TR> <TD CLASS=CN> <FONT COLOR=WHITE>版面数:</FONT> </TD> <TD> <ASP:LABEL ID="LBLFORUMCOUNT" RUNAT=SERVER CLASS=CN></ASP:LABEL> </TD> </TR> </TABLE> 然后在对应的C#文件里这样使用:
PROTECTED VOID PAGE_INIT(OBJECT SENDER, EVENTARGS E) { // // CODEGEN: THIS CALL IS REQUIRED BY THE ASP+ WINDOWS FORM DESIGNER. // INITIALIZECOMPONENT();
//初始化页面对象 //创建BBS对象 TRY { M_OBJBBS = NEW BBS("鹰翔山庄论坛") ; } CATCH(EXCEPTION EXP) { #IF DEBUG RESPONSE.WRITE ("初始化BBS对象出错:" + EXP.MESSAGE + "<BR>") ; RETURN ; #ENDIF//DEBUG SERVER.TRANSFER("ERROR.ASPX") ; } //论坛名称 LBLBBSNAME.FORECOLOR = COLOR.WHITE ; LBLBBSNAME.TEXT = M_OBJBBS.TITLE ;
//用户数 LBLUSERCOUNT.FORECOLOR = COLOR.WHITE ; LBLUSERCOUNT.TEXT = M_OBJBBS.USERCOUNT.TOSTRING() ;
//文章数 LBLTOPICCOUNT.FORECOLOR = COLOR.WHITE ; LBLTOPICCOUNT.TEXT = M_OBJBBS.TOPICCOUNT.TOSTRING() ;
//版面数 LBLFORUMCOUNT.FORECOLOR = COLOR.WHITE ; LBLFORUMCOUNT.TEXT = M_OBJBBS.FORUMCOUNT.TOSTRING() ; }
看出这样使用的好处吗?对,就是业务逻辑和HTML代码分开,这样无论页面原型如何修改,代码都不需要做丝毫改动。BBS对象构造好了,让我们看看论坛的其他对象,他们分别是用户(BBSUSER)、版面(FORUM)和贴子(TOPIC) , 我将在下节的内容里详细解释。
|