此文为http://keyss.cnblogs.com/archive/2005/12/02/289525.html后续文章

开发示例网站的主要目的如下:
    一、熟悉新的.Net开发环境,理解并掌握Asp.net2.0中新内置的安全认证及实现原理,掌握典型网站开发流程。
    二、针对新的.Net开发环境探索基于多层架构开发的成熟经验。
    三、熟悉System.Web.UI.WebControls命名空间中新的基类,以及新的页面生存期及控件生存期,并移植以前基于.Net1.0中的已有控件。

开发示例网站的总体设计思想:
    一、系统分四层实现
            1.数据库层
            2.数据访问层
            3.业务层
            4.界面层
其中前三层中基类代码主要通过Codesmith模板按需生成,在此附上针对友情链接表生成的代码及说明以供参考:
friendlink.rar  其界面网址为 http://www.keyss.cn/admin/basismodule/home/friendlink.aspx

在生成的代码中,为了迎合.net2.0中某些控件的需要新生成了一些函数:
如为了简单支持ObjectDataSource的增加修改删除功能实现了以下三个函数(请注意传进的参数):
        public virtual int Insert(FriendLinkInf inf);
        public virtual int Update(FriendLinkInf inf);
        public virtual int Delete(FriendLinkInf inf);
而为了支持GridView控件分页及跨页排序实现了以下两个函数:
        public DataTable GetPage(string fieldsName, string whereSql, string orderBy, int startIndex, int maxRecordReturn);
        public int GetRecordNumber(string fieldsName, string whereSql, string orderBy, int startIndex, int maxRecordReturn);
我想这里可能存在一个Net2.0中的一个小bug或者说不便的地方,就是取得所有记录数的函数的参数要和取得分页数据的选择函数的参数要完全一致,而按常理,获取记录数的参数只要有where条件就可以了。

而在界面层则主要利用GridView,FormView及ObjectDataSource实现数据的呈现及编辑。
之所以不用DetailView是因为他的界面样式过于单调,虽然他在数据绑定上有着更好的支持,比如空数据的显示及解析等等。而不用SqlDataSource是因为它过于简单并且有违多层开发的思想,只能用在简单的环境下实现快速开发。

下面是示例网站的一个典型管理页面的设计界面:

可以看到一个典型的页面中我放了两个ObjectDataSource对象,一个用来为gridview提供只读分页数据,而另一个则用来为FormView控件提供可修改的数据。
而为GridView提供数据的ObjectDataSource控件中两个参数是直接引用页面中两个hiddenfield的,这样的话我可以通过简单的设置这些控件的值来实现搜索和排序,因为ObjectDataSource会自动判断参数是否变化。
其中hfFilter的值是在查询面板中设置的,查询面板是我编的一个模板控件,主要实现客户端的面板显示及隐藏。而hfOrderBy的值是在GridView中的Sorting事件中设置的,这样是为了实现跨页排序。其代码如下:
    protected void gvItems_Sorting(object sender, GridViewSortEventArgs e)
    {
        string orderby = e.SortExpression;
        if (e.SortDirection == SortDirection.Descending)
        {
            orderby += " Desc";
        }
        hfOrderBy.Value = orderby;
    }

可以看到在整个页面的设计过程中,对服务器端控件,我都没有对外观作过设置,都是使用其的缺省的无样式,而显示的结果却不是这样,这主要归功于asp.net2.0的themes功能,利用skin可以象以前css样式一样来实现代码和样式分离。