ASP.NET高级教程(二)- 转换编程思维
 
上次的内容说过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) , 我将在下节的内容里详细解释。