学习PetShop3.0(2)宠物展示
生活随笔
收集整理的這篇文章主要介紹了
学习PetShop3.0(2)宠物展示
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
寵物展示,也就是商品展示(汗……)
涉及到這個(gè)主題的頁(yè)有Category.aspx?/?Items.aspx?/?ItemDetails.aspx,分別是大類(lèi)/小類(lèi)/詳細(xì)信息這三個(gè)。下面來(lái)一個(gè)一個(gè)的分析
要注意的是,像第一篇說(shuō)的,數(shù)據(jù)的傳遞都是采用直接傳遞業(yè)務(wù)實(shí)體的方法來(lái)完成。這樣是不是有很強(qiáng)的面向?qū)ο蟮奈兜?#xff1f;
Category.aspx
該頁(yè)面的主體是一個(gè)用戶自定義控件:SimplePager,該空間繼承自Repeater,作用當(dāng)然是存放寵物信息,他的數(shù)據(jù)源的獲得方式使用了.net的緩存api。具體實(shí)現(xiàn)代碼為:
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();
是使用了很普遍的做法來(lái)完成的,新數(shù)據(jù)的通過(guò)PetShop.BLL.Product.GetProductsByCategory方法獲得,梢后分析這個(gè)方法。SimplePager獲得數(shù)據(jù)后,就像普通的Repeater一樣根據(jù)模板的設(shè)定來(lái)顯示數(shù)據(jù)。對(duì)SimplePager的分析同樣放在后面。
用戶點(diǎn)擊具體的小類(lèi)后,就進(jìn)入小類(lèi)的頁(yè)面,通過(guò)url傳遞小類(lèi)的編號(hào)。
Items.aspx?
和上面的頁(yè)面基本一樣,因?yàn)槎际菍?duì)類(lèi)別進(jìn)行的操作嘛。
選擇具體的寵物后,就進(jìn)入詳細(xì)資料展示頁(yè)面了。
ItemDetails.aspx
這個(gè)頁(yè)面沒(méi)有使用緩存,而是直接通過(guò)業(yè)務(wù)邏輯層到數(shù)據(jù)庫(kù)去取記錄,然后返回到表示層。很簡(jiǎn)單,一看就懂的那種。
下面來(lái)看一下SimplePager控件。
控件的定義中重寫(xiě)了很多Repeater的方法,其用意主要是為了是其具有分頁(yè)的功能,看一下其中的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);
//從這里往下開(kāi)始是重寫(xiě)的關(guān)鍵部分,用來(lái)顯示上下頁(yè)的按鈕
//?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,用來(lái)對(duì)頁(yè)面切換進(jìn)行響應(yīng)。DataSource接受實(shí)現(xiàn)IList接口的數(shù)據(jù),而我們看上面大類(lèi)頁(yè)面在顯示的時(shí)候使用的語(yǔ)句
products.DataSource?=?productsByCategory;
productsByCategory作為業(yè)務(wù)邏輯組件一個(gè)方法的返回值,正是實(shí)現(xiàn)了IList接口的數(shù)據(jù)。
接下來(lái)看該數(shù)據(jù)是怎么得到的。
基本的過(guò)程都是從最后的數(shù)據(jù)操作組件開(kāi)始層層的傳遞過(guò)來(lái),因此我們直接看最后的數(shù)據(jù)操作部分。
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里添加一整個(gè)的ProductInfo實(shí)體
ProductInfo?product?=?new?ProductInfo(rdr.GetString(0),?rdr.GetString(1),?null);
productsByCategory.Add(product);
}
}
return?productsByCategory;
}
很明顯,返回的是一個(gè)ArrayList。這個(gè)里面放著該大類(lèi)的所有小類(lèi)的資料。一個(gè)小類(lèi)就是一個(gè)ProductInfo,而ProductInfo作為一個(gè)瘦數(shù)據(jù)類(lèi)存放小類(lèi)的一些基本資料。
現(xiàn)在我們?cè)诨仡^看一下在Category.aspx中SimplePager的部分標(biāo)記代碼?
<%#?DataBinder.Eval(Container.DataItem,?"Id")?%>
從數(shù)據(jù)綁定的知識(shí)可以得到,這個(gè)id其實(shí)是ProductInfo的一個(gè)屬性。
if(itemsByProduct.Count?>?0)
在Items.aspx中進(jìn)行的數(shù)據(jù)操作和Category.aspx的基本一樣。
Items.aspx.cs里最后有這么一句代碼:
productName.Text?=?((ItemInfo)itemsByProduct[0]).ProductName;
因?yàn)閕temsByProduct是一個(gè)ArrayList,所以itemsByProduct[0]實(shí)際上返回的就是一個(gè)ItemInfo。
從上面的分析可以看出,業(yè)務(wù)邏輯和業(yè)務(wù)實(shí)體分開(kāi)來(lái)的好處。
作者:邁克老貓
涉及到這個(gè)主題的頁(yè)有Category.aspx?/?Items.aspx?/?ItemDetails.aspx,分別是大類(lèi)/小類(lèi)/詳細(xì)信息這三個(gè)。下面來(lái)一個(gè)一個(gè)的分析
要注意的是,像第一篇說(shuō)的,數(shù)據(jù)的傳遞都是采用直接傳遞業(yè)務(wù)實(shí)體的方法來(lái)完成。這樣是不是有很強(qiáng)的面向?qū)ο蟮奈兜?#xff1f;
Category.aspx
該頁(yè)面的主體是一個(gè)用戶自定義控件:SimplePager,該空間繼承自Repeater,作用當(dāng)然是存放寵物信息,他的數(shù)據(jù)源的獲得方式使用了.net的緩存api。具體實(shí)現(xiàn)代碼為:
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();
是使用了很普遍的做法來(lái)完成的,新數(shù)據(jù)的通過(guò)PetShop.BLL.Product.GetProductsByCategory方法獲得,梢后分析這個(gè)方法。SimplePager獲得數(shù)據(jù)后,就像普通的Repeater一樣根據(jù)模板的設(shè)定來(lái)顯示數(shù)據(jù)。對(duì)SimplePager的分析同樣放在后面。
用戶點(diǎn)擊具體的小類(lèi)后,就進(jìn)入小類(lèi)的頁(yè)面,通過(guò)url傳遞小類(lèi)的編號(hào)。
Items.aspx?
和上面的頁(yè)面基本一樣,因?yàn)槎际菍?duì)類(lèi)別進(jìn)行的操作嘛。
選擇具體的寵物后,就進(jìn)入詳細(xì)資料展示頁(yè)面了。
ItemDetails.aspx
這個(gè)頁(yè)面沒(méi)有使用緩存,而是直接通過(guò)業(yè)務(wù)邏輯層到數(shù)據(jù)庫(kù)去取記錄,然后返回到表示層。很簡(jiǎn)單,一看就懂的那種。
下面來(lái)看一下SimplePager控件。
控件的定義中重寫(xiě)了很多Repeater的方法,其用意主要是為了是其具有分頁(yè)的功能,看一下其中的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);
//從這里往下開(kāi)始是重寫(xiě)的關(guān)鍵部分,用來(lái)顯示上下頁(yè)的按鈕
//?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,用來(lái)對(duì)頁(yè)面切換進(jìn)行響應(yīng)。DataSource接受實(shí)現(xiàn)IList接口的數(shù)據(jù),而我們看上面大類(lèi)頁(yè)面在顯示的時(shí)候使用的語(yǔ)句
products.DataSource?=?productsByCategory;
productsByCategory作為業(yè)務(wù)邏輯組件一個(gè)方法的返回值,正是實(shí)現(xiàn)了IList接口的數(shù)據(jù)。
接下來(lái)看該數(shù)據(jù)是怎么得到的。
基本的過(guò)程都是從最后的數(shù)據(jù)操作組件開(kāi)始層層的傳遞過(guò)來(lái),因此我們直接看最后的數(shù)據(jù)操作部分。
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里添加一整個(gè)的ProductInfo實(shí)體
ProductInfo?product?=?new?ProductInfo(rdr.GetString(0),?rdr.GetString(1),?null);
productsByCategory.Add(product);
}
}
return?productsByCategory;
}
很明顯,返回的是一個(gè)ArrayList。這個(gè)里面放著該大類(lèi)的所有小類(lèi)的資料。一個(gè)小類(lèi)就是一個(gè)ProductInfo,而ProductInfo作為一個(gè)瘦數(shù)據(jù)類(lèi)存放小類(lèi)的一些基本資料。
現(xiàn)在我們?cè)诨仡^看一下在Category.aspx中SimplePager的部分標(biāo)記代碼?
<%#?DataBinder.Eval(Container.DataItem,?"Id")?%>
從數(shù)據(jù)綁定的知識(shí)可以得到,這個(gè)id其實(shí)是ProductInfo的一個(gè)屬性。
if(itemsByProduct.Count?>?0)
在Items.aspx中進(jìn)行的數(shù)據(jù)操作和Category.aspx的基本一樣。
Items.aspx.cs里最后有這么一句代碼:
productName.Text?=?((ItemInfo)itemsByProduct[0]).ProductName;
因?yàn)閕temsByProduct是一個(gè)ArrayList,所以itemsByProduct[0]實(shí)際上返回的就是一個(gè)ItemInfo。
從上面的分析可以看出,業(yè)務(wù)邏輯和業(yè)務(wù)實(shí)體分開(kāi)來(lái)的好處。
作者:邁克老貓
轉(zhuǎn)載于:https://www.cnblogs.com/kyo1028/archive/2006/04/13/373927.html
總結(jié)
以上是生活随笔為你收集整理的学习PetShop3.0(2)宠物展示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自定义控件学习,优秀网站推荐
- 下一篇: 跃我T-Rex 2迎来重要更新:支持路线