Scott Mitchell ASP.NET 2數(shù)據(jù)控件嵌套(4)_.Net教程
推薦:ASP.Net中無(wú)刷新執(zhí)行Session身份驗(yàn)證在寫(xiě)一個(gè)客戶的B/S結(jié)構(gòu)應(yīng)用程序時(shí),突然發(fā)現(xiàn)一個(gè)技巧,不知道是否是MS的一個(gè)BUG,給相關(guān)的有研究的朋友原先考慮寫(xiě)一個(gè)檢查Session的類,Session失效后,必須轉(zhuǎn)向登陸頁(yè)面,可每一個(gè)調(diào)用該類的頁(yè)
圖 5: 外層的Repeater 列出每個(gè)Category; 內(nèi)層的Repeater 列出屬于Category的Products
直接編程來(lái)獲取Category 下的Products
除了使用ObjectDataSource來(lái)獲取當(dāng)前category下的proudct外,我們還可以在ASP.NET頁(yè)的code-behind里(或App_Code文件夾里或一個(gè)單獨(dú)的類項(xiàng)目里)來(lái)創(chuàng)建一個(gè)根據(jù)傳入的CategoryID返回合適的product集的方法.假設(shè)在ASP.NET頁(yè)的code-behind里有一個(gè)名為GetProductsInCategory(categoryID)方法.我們可以使用這個(gè)方法來(lái)將當(dāng)前category下的product綁定到內(nèi)層的Repeater.見(jiàn)下面的代碼:
ASP.NET | |
1 2 3 4 |
<asp:Repeater runat="server" ID="ProductsByCategoryList" EnableViewState="False" DataSource='<%# GetProductsInCategory(CType(Eval("CategoryID"), Integer)) %>'> ... </asp:Repeater> |
Repeater的DataSource屬性通過(guò)綁定語(yǔ)法來(lái)指定它的數(shù)據(jù)是通過(guò)GetProductsInCategory(categoryID)得到.由于Eval("CategryID")返回的是Object類型,我們?cè)谒鼈魅隚etProductsInCategory(categoryID)前將它轉(zhuǎn)化成Integer.注意這里的CategoryID是通過(guò)外層Repeater(CategoryList)的CategoryID(已經(jīng)綁定到Categories table)獲取的.因此它不可能是一個(gè)NULL值.所以我們?cè)诮壎ㄇ皼](méi)有檢查.
我們現(xiàn)在需要?jiǎng)?chuàng)建GetProductsInCategory(categoryID)方法.在這里簡(jiǎn)單使用ProductsBLL類的GetProductsByCategoryID(categoryID)方法返回的ProductsDataTable就可以了.我們?cè)贜estedControls.aspx頁(yè)的code-behind里創(chuàng)建GetProductsInCategory(categoryID).見(jiàn)下面的代碼:
C# | |
1 2 3 4 5 6 7 8 |
protected Northwind.ProductsDataTable GetProductsInCategory(int categoryID) { // Create an instance of the ProductsBLL class ProductsBLL productAPI = new ProductsBLL(); // Return the products in the category return productAPI.GetProductsByCategoryID(categoryID); } |
這個(gè)方法僅僅是創(chuàng)建一個(gè)ProductsBLL實(shí)例然后返回GetProductsByCategoryID(categoryID)方法的返回值.注意這個(gè)方法必須標(biāo)記為Public或Protected.如果標(biāo)記為Private,ASP.NET頁(yè)的聲明標(biāo)記里將不能調(diào)用它.
做完以上操作后,在瀏覽器里瀏覽頁(yè)面.頁(yè)面看起來(lái)應(yīng)該和使用ObjectDataSource 和ItemDataBound event handler方法差不多(圖5).
注意:在ASP.NET頁(yè)的code-behind里創(chuàng)建GetProductsInCategory(categoryID)方法好象只是一個(gè)形式,畢竟這個(gè)方法只是調(diào)用BLL里的方法.為什么不直接在內(nèi)層Repeater里的綁定語(yǔ)法里直接調(diào)用這個(gè)方法.比如:
DataSource='<%#ProductsBLL.GetProductsByCategoryID(CType(Eval("CategoryID"),Integer))%>')
雖然這個(gè)聲明是不起作用的(因?yàn)镚etProductsByCategoryID(categoryID)方法是一個(gè)實(shí)例方法),你可以修改ProductsBLL來(lái)包含一個(gè)這樣的靜態(tài)方法.
這樣的修改可以滿足ASP.NET頁(yè)的GetProductsInCategory(categoryID)方法的需要,但是寫(xiě)在code-behind里可以更靈活的獲取數(shù)據(jù),我們?cè)诤竺鏁?huì)看到這點(diǎn).
獲取所有的Product 信息
前面兩個(gè)方法我們通過(guò)調(diào)用ProductsBLL類的GetProductsByCategoryID(categoryID)方法來(lái)獲取當(dāng)前category的product(第一種通過(guò)ObjectDataSource,第二種通過(guò)GetProductsInCategory(categoryID)).每次方法被調(diào)用時(shí),BLL調(diào)用DAL,DAL通過(guò)SQL查詢數(shù)據(jù)庫(kù),返回特定的記錄.
如果有N個(gè)category,這個(gè)方法會(huì)訪問(wèn)數(shù)據(jù)庫(kù)N 1次— 一次返回所有的category,N次返回特定category下的product.然而我們可以通過(guò)訪問(wèn)數(shù)據(jù)庫(kù)兩次來(lái)獲取所有需要的數(shù)據(jù)— 一次返回所有的category,一次返回所有的product.一旦我們得到所有的product,我們可以根據(jù)CategoryID來(lái)過(guò)濾,然后再綁定.
我們只需要稍微修改ASP.NET頁(yè)的code-behind里的GetProductsInCategory(categoryID)方法來(lái)實(shí)現(xiàn)這個(gè)功能.我們首先來(lái)返回所有的product,然后根據(jù)傳入的CategoryID里過(guò)濾.
C# | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private Northwind.ProductsDataTable allProducts = null; protected Northwind.ProductsDataTable GetProductsInCategory(int categoryID) { // First, see if we've yet to have accessed all of the product information if (allProducts == null) { ProductsBLL productAPI = new ProductsBLL(); allProducts = productAPI.GetProducts(); } // Return the filtered view allProducts.DefaultView.RowFilter = "CategoryID = " categoryID; return allProducts; } |
注意allProducts變量.它在第一次調(diào)用GetProductsInCategory(categoryID)時(shí)返回所有product信息.確定allProducts對(duì)象被創(chuàng)建后,在根據(jù)CategoryID來(lái)對(duì)DataTable過(guò)濾.這個(gè)方法將訪問(wèn)數(shù)據(jù)庫(kù)的次數(shù)從N 1減少到2次.
這個(gè)改進(jìn)沒(méi)有修改頁(yè)面的聲明語(yǔ)言.僅僅只是減少了數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù).
注意:可能想當(dāng)然的覺(jué)得減少了數(shù)據(jù)庫(kù)訪問(wèn)次數(shù)會(huì)提高性能.但是這個(gè)不一定.如果你有大量的categoryID為NULL的product,這樣使用GetProducts方法返回的product有一部分不會(huì)被顯示.而且如果你只需要顯示一部分category的proudct(分頁(yè)時(shí)就是這樣),而返回所有的product,這樣對(duì)資源也是一種浪費(fèi).
通常對(duì)兩種技術(shù)進(jìn)行性能分析,唯一正確的方法是設(shè)置程序常見(jiàn)的場(chǎng)景來(lái)進(jìn)行壓力測(cè)試.
總結(jié)
本章我們學(xué)習(xí)了如何嵌套Web控件.通過(guò)如何在外層Repeater顯示各個(gè)category,內(nèi)層Repeater顯示每個(gè)category下的product來(lái)作為例子.主要的任務(wù)在于獲取正確的數(shù)據(jù)并綁定到內(nèi)層的Web控件上.有很多方法可以使用,我們這里討論了兩種.第一種是使用在外層控件的ItemTemplate里ObjectDataSource來(lái)綁定到內(nèi)層控件.第二種是使用ASP.NET頁(yè)的code-behind里的方法.它通過(guò)內(nèi)層控件的DataSource屬性來(lái)綁定.
本章使用的控件是Repeater,也可以將Repeater嵌套在GridView里,或GridView嵌套在DataList里等.
祝變成快樂(lè)!
分享:.net教程:ASP.NET GridView的分頁(yè)功能要實(shí)現(xiàn)GrdView分頁(yè)的功能。 操作如下: 1、更改GrdView控件的AllowPaging屬性為true。 2、更改GrdView控件的PageSize屬性為 任意數(shù)值(默認(rèn)為10) 3、更改GrdView控件的PageSetting->Mod
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- asp.net回發(fā)或回調(diào)參數(shù)無(wú)效解決方法
- ASP.NET立即上手教程(10)
- 在.net中如何利用數(shù)據(jù)工廠實(shí)現(xiàn)多數(shù)據(jù)庫(kù)的操作
- ASP.NET2.0服務(wù)器控件之創(chuàng)建復(fù)雜屬性
- 解析WPF實(shí)現(xiàn)音頻文件循環(huán)順序播放的解決方法
- 解讀ASP.NET密碼強(qiáng)度驗(yàn)證代碼實(shí)例
- 解析Web開(kāi)發(fā)模式的顛覆者:ASP.NET MVC
- .NET中如何生成靜態(tài)頁(yè)
- 淺析8月編程語(yǔ)言榜:.Net前景如何?
- 關(guān)于asp.net 自定義分頁(yè)控件
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索Scott Mitchell ASP.NET 2數(shù)據(jù)控件嵌套(4)
- 教程說(shuō)明:
.Net教程-Scott Mitchell ASP.NET 2數(shù)據(jù)控件嵌套(4)
。