学习PetShop3.0(2)宠物展示
生活随笔
收集整理的這篇文章主要介紹了
学习PetShop3.0(2)宠物展示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寵物展示,也就是商品展示(汗……)
涉及到這個主題的頁有Category.aspx?/?Items.aspx?/?ItemDetails.aspx,分別是大類/小類/詳細信息這三個。下面來一個一個的分析
要注意的是,像第一篇說的,數據的傳遞都是采用直接傳遞業務實體的方法來完成。這樣是不是有很強的面向對象的味道?
Category.aspx
該頁面的主體是一個用戶自定義控件:SimplePager,該空間繼承自Repeater,作用當然是存放寵物信息,他的數據源的獲得方式使用了.net的緩存api。具體實現代碼為:
if(Cache[categoryKey]?!=?null){
//?If?the?data?is?already?cached,?then?used?the?cached?copy
products.DataSource?=?(IList)Cache[categoryKey];
}else{
//?If?the?data?is?not?cached,?then?create?a?new?products?object?and?request?the?data
Product?product?=?new?Product();
IList?productsByCategory?=?product.GetProductsByCategory(categoryKey);
//?Store?the?results?of?the?call?in?the?Cache?and?set?the?time?out?to?12?hours
Cache.Add(categoryKey,?productsByCategory,?null,?DateTime.Now.AddHours(12),?Cache.NoSlidingExpiration?,?CacheItemPriority.High,?null);
products.DataSource?=?productsByCategory;
}
//?Bind?the?data?to?the?control
products.DataBind();
是使用了很普遍的做法來完成的,新數據的通過PetShop.BLL.Product.GetProductsByCategory方法獲得,梢后分析這個方法。SimplePager獲得數據后,就像普通的Repeater一樣根據模板的設定來顯示數據。對SimplePager的分析同樣放在后面。
用戶點擊具體的小類后,就進入小類的頁面,通過url傳遞小類的編號。
Items.aspx?
和上面的頁面基本一樣,因為都是對類別進行的操作嘛。
選擇具體的寵物后,就進入詳細資料展示頁面了。
ItemDetails.aspx
這個頁面沒有使用緩存,而是直接通過業務邏輯層到數據庫去取記錄,然后返回到表示層。很簡單,一看就懂的那種。
下面來看一下SimplePager控件。
控件的定義中重寫了很多Repeater的方法,其用意主要是為了是其具有分頁的功能,看一下其中的Render方法。
PetShop.Web.Controls.SimplePager?:?Repeater?
override?protected?void?Render(HtmlTextWriter?writer)?{
//Check?there?is?some?data?attached
if?(ItemCount?==?0)?{
writer.Write(emptyText);
return;
}
//Mask?the?query
string?query?=?Context.Request.Url.Query.Replace(COMMA,?AMP);
query?=?RX.Replace(query,?string.Empty);
//?Write?out?the?first?part?of?the?control,?the?table?header
writer.Write(HTML1);
//?Call?the?inherited?method
base.Render(writer);
//從這里往下開始是重寫的關鍵部分,用來顯示上下頁的按鈕
//?Write?out?a?table?row?closure
writer.Write(HTML2);
//Determin?whether?next?and?previous?buttons?are?required
//Previous?button?
if?(currentPageIndex?>?0)
writer.Write(string.Format(LINK_PREV,?(currentPageIndex?-?1)?+?query));
//other?.....
}
另外該控件還有自定義的事件PageIndexChanged,用來對頁面切換進行響應。DataSource接受實現IList接口的數據,而我們看上面大類頁面在顯示的時候使用的語句
products.DataSource?=?productsByCategory;
productsByCategory作為業務邏輯組件一個方法的返回值,正是實現了IList接口的數據。
接下來看該數據是怎么得到的。
基本的過程都是從最后的數據操作組件開始層層的傳遞過來,因此我們直接看最后的數據操作部分。
PetShop.SQLServerDAL.Product?:?IProduct
public?IList?GetProductsByCategory(string?category)?{
IList?productsByCategory?=?new?ArrayList();
SqlParameter?parm?=?new?SqlParameter(PARM_CATEGORY,?SqlDbType.Char,?10);
parm.Value?=?category;
//Execute?a?query?to?read?the?products
using?(SqlDataReader?rdr?=?SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_NON_DTC,?CommandType.Text,?SQL_SELECT_PRODUCTS_BY_CATEGORY,?parm))?{
while?(rdr.Read()){
//向ArrayList里添加一整個的ProductInfo實體
ProductInfo?product?=?new?ProductInfo(rdr.GetString(0),?rdr.GetString(1),?null);
productsByCategory.Add(product);
}
}
return?productsByCategory;
}
很明顯,返回的是一個ArrayList。這個里面放著該大類的所有小類的資料。一個小類就是一個ProductInfo,而ProductInfo作為一個瘦數據類存放小類的一些基本資料。
現在我們在回頭看一下在Category.aspx中SimplePager的部分標記代碼?
<%#?DataBinder.Eval(Container.DataItem,?"Id")?%>
從數據綁定的知識可以得到,這個id其實是ProductInfo的一個屬性。
if(itemsByProduct.Count?>?0)
在Items.aspx中進行的數據操作和Category.aspx的基本一樣。
Items.aspx.cs里最后有這么一句代碼:
productName.Text?=?((ItemInfo)itemsByProduct[0]).ProductName;
因為itemsByProduct是一個ArrayList,所以itemsByProduct[0]實際上返回的就是一個ItemInfo。
從上面的分析可以看出,業務邏輯和業務實體分開來的好處。
作者:邁克老貓
涉及到這個主題的頁有Category.aspx?/?Items.aspx?/?ItemDetails.aspx,分別是大類/小類/詳細信息這三個。下面來一個一個的分析
要注意的是,像第一篇說的,數據的傳遞都是采用直接傳遞業務實體的方法來完成。這樣是不是有很強的面向對象的味道?
Category.aspx
該頁面的主體是一個用戶自定義控件:SimplePager,該空間繼承自Repeater,作用當然是存放寵物信息,他的數據源的獲得方式使用了.net的緩存api。具體實現代碼為:
if(Cache[categoryKey]?!=?null){
//?If?the?data?is?already?cached,?then?used?the?cached?copy
products.DataSource?=?(IList)Cache[categoryKey];
}else{
//?If?the?data?is?not?cached,?then?create?a?new?products?object?and?request?the?data
Product?product?=?new?Product();
IList?productsByCategory?=?product.GetProductsByCategory(categoryKey);
//?Store?the?results?of?the?call?in?the?Cache?and?set?the?time?out?to?12?hours
Cache.Add(categoryKey,?productsByCategory,?null,?DateTime.Now.AddHours(12),?Cache.NoSlidingExpiration?,?CacheItemPriority.High,?null);
products.DataSource?=?productsByCategory;
}
//?Bind?the?data?to?the?control
products.DataBind();
是使用了很普遍的做法來完成的,新數據的通過PetShop.BLL.Product.GetProductsByCategory方法獲得,梢后分析這個方法。SimplePager獲得數據后,就像普通的Repeater一樣根據模板的設定來顯示數據。對SimplePager的分析同樣放在后面。
用戶點擊具體的小類后,就進入小類的頁面,通過url傳遞小類的編號。
Items.aspx?
和上面的頁面基本一樣,因為都是對類別進行的操作嘛。
選擇具體的寵物后,就進入詳細資料展示頁面了。
ItemDetails.aspx
這個頁面沒有使用緩存,而是直接通過業務邏輯層到數據庫去取記錄,然后返回到表示層。很簡單,一看就懂的那種。
下面來看一下SimplePager控件。
控件的定義中重寫了很多Repeater的方法,其用意主要是為了是其具有分頁的功能,看一下其中的Render方法。
PetShop.Web.Controls.SimplePager?:?Repeater?
override?protected?void?Render(HtmlTextWriter?writer)?{
//Check?there?is?some?data?attached
if?(ItemCount?==?0)?{
writer.Write(emptyText);
return;
}
//Mask?the?query
string?query?=?Context.Request.Url.Query.Replace(COMMA,?AMP);
query?=?RX.Replace(query,?string.Empty);
//?Write?out?the?first?part?of?the?control,?the?table?header
writer.Write(HTML1);
//?Call?the?inherited?method
base.Render(writer);
//從這里往下開始是重寫的關鍵部分,用來顯示上下頁的按鈕
//?Write?out?a?table?row?closure
writer.Write(HTML2);
//Determin?whether?next?and?previous?buttons?are?required
//Previous?button?
if?(currentPageIndex?>?0)
writer.Write(string.Format(LINK_PREV,?(currentPageIndex?-?1)?+?query));
//other?.....
}
另外該控件還有自定義的事件PageIndexChanged,用來對頁面切換進行響應。DataSource接受實現IList接口的數據,而我們看上面大類頁面在顯示的時候使用的語句
products.DataSource?=?productsByCategory;
productsByCategory作為業務邏輯組件一個方法的返回值,正是實現了IList接口的數據。
接下來看該數據是怎么得到的。
基本的過程都是從最后的數據操作組件開始層層的傳遞過來,因此我們直接看最后的數據操作部分。
PetShop.SQLServerDAL.Product?:?IProduct
public?IList?GetProductsByCategory(string?category)?{
IList?productsByCategory?=?new?ArrayList();
SqlParameter?parm?=?new?SqlParameter(PARM_CATEGORY,?SqlDbType.Char,?10);
parm.Value?=?category;
//Execute?a?query?to?read?the?products
using?(SqlDataReader?rdr?=?SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_NON_DTC,?CommandType.Text,?SQL_SELECT_PRODUCTS_BY_CATEGORY,?parm))?{
while?(rdr.Read()){
//向ArrayList里添加一整個的ProductInfo實體
ProductInfo?product?=?new?ProductInfo(rdr.GetString(0),?rdr.GetString(1),?null);
productsByCategory.Add(product);
}
}
return?productsByCategory;
}
很明顯,返回的是一個ArrayList。這個里面放著該大類的所有小類的資料。一個小類就是一個ProductInfo,而ProductInfo作為一個瘦數據類存放小類的一些基本資料。
現在我們在回頭看一下在Category.aspx中SimplePager的部分標記代碼?
<%#?DataBinder.Eval(Container.DataItem,?"Id")?%>
從數據綁定的知識可以得到,這個id其實是ProductInfo的一個屬性。
if(itemsByProduct.Count?>?0)
在Items.aspx中進行的數據操作和Category.aspx的基本一樣。
Items.aspx.cs里最后有這么一句代碼:
productName.Text?=?((ItemInfo)itemsByProduct[0]).ProductName;
因為itemsByProduct是一個ArrayList,所以itemsByProduct[0]實際上返回的就是一個ItemInfo。
從上面的分析可以看出,業務邏輯和業務實體分開來的好處。
作者:邁克老貓
轉載于:https://www.cnblogs.com/kyo1028/archive/2006/04/13/373927.html
總結
以上是生活随笔為你收集整理的学习PetShop3.0(2)宠物展示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义控件学习,优秀网站推荐
- 下一篇: Web Service应用举例 及一问题