Scott Mitchell ASP.NET 2數據控件嵌套(4)_.Net教程
推薦:ASP.Net中無刷新執行Session身份驗證在寫一個客戶的B/S結構應用程序時,突然發現一個技巧,不知道是否是MS的一個BUG,給相關的有研究的朋友原先考慮寫一個檢查Session的類,Session失效后,必須轉向登陸頁面,可每一個調用該類的頁
圖 5: 外層的Repeater 列出每個Category; 內層的Repeater 列出屬于Category的Products
直接編程來獲取Category 下的Products
除了使用ObjectDataSource來獲取當前category下的proudct外,我們還可以在ASP.NET頁的code-behind里(或App_Code文件夾里或一個單獨的類項目里)來創建一個根據傳入的CategoryID返回合適的product集的方法.假設在ASP.NET頁的code-behind里有一個名為GetProductsInCategory(categoryID)方法.我們可以使用這個方法來將當前category下的product綁定到內層的Repeater.見下面的代碼:
| ASP.NET | |
1 2 3 4 |
<asp:Repeater runat="server" ID="ProductsByCategoryList" EnableViewState="False" DataSource='<%# GetProductsInCategory(CType(Eval("CategoryID"), Integer)) %>'> ... </asp:Repeater> |
Repeater的DataSource屬性通過綁定語法來指定它的數據是通過GetProductsInCategory(categoryID)得到.由于Eval("CategryID")返回的是Object類型,我們在它傳入GetProductsInCategory(categoryID)前將它轉化成Integer.注意這里的CategoryID是通過外層Repeater(CategoryList)的CategoryID(已經綁定到Categories table)獲取的.因此它不可能是一個NULL值.所以我們在綁定前沒有檢查.
我們現在需要創建GetProductsInCategory(categoryID)方法.在這里簡單使用ProductsBLL類的GetProductsByCategoryID(categoryID)方法返回的ProductsDataTable就可以了.我們在NestedControls.aspx頁的code-behind里創建GetProductsInCategory(categoryID).見下面的代碼:
| 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); } |
這個方法僅僅是創建一個ProductsBLL實例然后返回GetProductsByCategoryID(categoryID)方法的返回值.注意這個方法必須標記為Public或Protected.如果標記為Private,ASP.NET頁的聲明標記里將不能調用它.
做完以上操作后,在瀏覽器里瀏覽頁面.頁面看起來應該和使用ObjectDataSource 和ItemDataBound event handler方法差不多(圖5).
注意:在ASP.NET頁的code-behind里創建GetProductsInCategory(categoryID)方法好象只是一個形式,畢竟這個方法只是調用BLL里的方法.為什么不直接在內層Repeater里的綁定語法里直接調用這個方法.比如:
DataSource='<%#ProductsBLL.GetProductsByCategoryID(CType(Eval("CategoryID"),Integer))%>')
雖然這個聲明是不起作用的(因為GetProductsByCategoryID(categoryID)方法是一個實例方法),你可以修改ProductsBLL來包含一個這樣的靜態方法.
這樣的修改可以滿足ASP.NET頁的GetProductsInCategory(categoryID)方法的需要,但是寫在code-behind里可以更靈活的獲取數據,我們在后面會看到這點.
獲取所有的Product 信息
前面兩個方法我們通過調用ProductsBLL類的GetProductsByCategoryID(categoryID)方法來獲取當前category的product(第一種通過ObjectDataSource,第二種通過GetProductsInCategory(categoryID)).每次方法被調用時,BLL調用DAL,DAL通過SQL查詢數據庫,返回特定的記錄.
如果有N個category,這個方法會訪問數據庫N 1次— 一次返回所有的category,N次返回特定category下的product.然而我們可以通過訪問數據庫兩次來獲取所有需要的數據— 一次返回所有的category,一次返回所有的product.一旦我們得到所有的product,我們可以根據CategoryID來過濾,然后再綁定.
我們只需要稍微修改ASP.NET頁的code-behind里的GetProductsInCategory(categoryID)方法來實現這個功能.我們首先來返回所有的product,然后根據傳入的CategoryID里過濾.
| 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變量.它在第一次調用GetProductsInCategory(categoryID)時返回所有product信息.確定allProducts對象被創建后,在根據CategoryID來對DataTable過濾.這個方法將訪問數據庫的次數從N 1減少到2次.
這個改進沒有修改頁面的聲明語言.僅僅只是減少了數據庫的訪問次數.
注意:可能想當然的覺得減少了數據庫訪問次數會提高性能.但是這個不一定.如果你有大量的categoryID為NULL的product,這樣使用GetProducts方法返回的product有一部分不會被顯示.而且如果你只需要顯示一部分category的proudct(分頁時就是這樣),而返回所有的product,這樣對資源也是一種浪費.
通常對兩種技術進行性能分析,唯一正確的方法是設置程序常見的場景來進行壓力測試.
總結
本章我們學習了如何嵌套Web控件.通過如何在外層Repeater顯示各個category,內層Repeater顯示每個category下的product來作為例子.主要的任務在于獲取正確的數據并綁定到內層的Web控件上.有很多方法可以使用,我們這里討論了兩種.第一種是使用在外層控件的ItemTemplate里ObjectDataSource來綁定到內層控件.第二種是使用ASP.NET頁的code-behind里的方法.它通過內層控件的DataSource屬性來綁定.
本章使用的控件是Repeater,也可以將Repeater嵌套在GridView里,或GridView嵌套在DataList里等.
祝變成快樂!
分享:.net教程:ASP.NET GridView的分頁功能要實現GrdView分頁的功能。 操作如下: 1、更改GrdView控件的AllowPaging屬性為true。 2、更改GrdView控件的PageSize屬性為 任意數值(默認為10) 3、更改GrdView控件的PageSetting->Mod
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-Scott Mitchell ASP.NET 2數據控件嵌套(4)
。