此文為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樣式一樣來實現代碼和樣式分離。