1. 程式人生 > >.net分頁解決方案

.net分頁解決方案

對於分頁效能,有一個原則就是頁面需要顯示多少資料,我們就紿它多少資料。根據這個原則,我們可以紿出三層架構的分頁解決方案。

 

1. 資料層

在資料層,運用分頁儲存過程或分頁SQL查詢,我們很容易可以在網上找到通用的分頁儲存過程,當然我們可以根據自己要的效能寫出更為高效的儲存過程和SQL查詢語句。

概括起來,總結自定義資料分頁在資料層主要包含四種方式:

1) 使用臨時表――此方法被廣泛使用論壇CommunityServer、部落格等開原始碼

2) 使用儲存過程――這個方法好像最初來自CSDN上的一篇,可以到如下網址檢視部落格圓裡的一篇文章

http://genson.cnblogs.com/archive/2006/01/17/318882.html

3) 利用SQL語句選取有限資料分頁。

 

2. 資料訪問層

在資料訪問層呼叫儲存過程或執行分頁SQL查詢。並在資料訪問層返回集合或其它資料結構紿業務層。

一般我們在資料訪問層會使用的如下資料結構到傳遞資料。

1)  自定義實體類

2)  資料表

3)  DataSet

4)  C# 2.0 泛型如List<T>其中T為自定義實體類

 

3. 業務層

在業務層,我們將資料訪問層的資料傳遞紿表現層。當然資料傳遞的資料結構也如上面幾種方法,我們可以參照MSDN上一篇文章叫《設計資料層元件並在層間傳遞資料》來選擇合適的資料結構傳遞資料。

 

4. 表現層

其 實我們在分頁解決方案裡最難的並不是儲存過程,各層之間資料傳遞,這些對資料的操作是我們所熟知的。也不必費多大的勁就可以搞定這些,但在表現層就不同 了,因為HTTP是無連線的協議,要在伺服器上得知每個客戶端正在訪問第幾頁,將要訪問第幾頁,每頁要顯示多少資料,這些需要允分了解ASP.NET的狀 態機制。

首先我們來看看分頁時在UI層要呈現哪些東西

1)  呈現當前頁的資料,這是最重要的,這些資料我們根據當前是第幾頁,每頁顯示多少條資料來查詢資料庫。

2)  呈現導航連結。導航連結我們根據當前頁,總頁數來動態的顯示連結。

3)  當前頁狀態資訊。在UI層我們可以顯示總頁數,當前頁是第幾頁。當然這不是必須的。

4)  表現層的事件。在表現層當我們點選導航連結的時候,如何在伺服器端捕獲客戶端發生的事件和客戶端當前的狀態並作出正確的響應。

5)  在客戶端呈現的時候,我們要在客戶端儲存幾個有用的資訊,

a. 當前使用者在第幾頁 

b. 要使伺服器端能從使用者點選導航連結時所要的資料,即下個狀態跳轉到第幾頁。

 

把各層聯絡起來就是,在客戶端所發生的分頁事件在伺服器端的表現層捕獲後呼叫業務層,業務層再呼叫資料訪問層,資料訪問層再呼叫資料層以獲取資料,層間傳遞的資料結構可選擇。

 

現在來看看ASP.NET 2.0幾種常見的三層分頁解決方案

1)  GridView +ObjectDataSource

ASP.NET2.0 提供了SqlDataSource資料來源控制元件,支援用於指定連線字串、SQL 語句或儲存過程的屬性,用以
引用: http://www.yaosansi.com/blog/trackback.asp?tbID=801
 文章來自: 部落格園

查詢或修改資料庫。但是, SqlDataSource 控制元件存在一個問題:該控制元件的缺點在於它迫使您將使用者介面層與業務邏輯層混合在一起。然而隨著應用程式規模的擴大,您會越來越 感覺到混合多個層的做法是不可取的。 生成嚴格意義上的多層 Web 應用程式時,您應該具有清晰的使用者介面層、業務邏輯層和資料訪問層。僅僅由於  SqlDataSource 控制元件的強制而在使用者介面層引用 SQL 語句或儲存過程是不可取的。

ObjectDataSource  控制元件物件模型類似於 SqlDataSource 控制元件。ObjectDataSource 公開一個 TypeName 屬性(而不是  ConnectionString 屬性),該屬性指定要例項化來執行資料操作的物件型別(類名)。類似於 SqlDataSource 的命令屬性, ObjectDataSource 控制元件支援諸如 SelectMethod、UpdateMethod、InsertMethod 和  DeleteMethod 的屬性,用於指定要呼叫來執行這些資料操作的關聯型別的方法。ObjectDataSource可以通過TypeName  屬性直接呼叫業務層的類。

ObjectDataSource對分頁的支援,在ObjectDataSource呼叫的業務層類中對應 SelectMethod的方法中要實現ObjectDataSource的兩個引數MaximumRowsParameterName,  StartRowIndexParameterName。還要實現ObjectDataSource中的SelectCountMethod方法,這是 查詢資料總資料,以便GridView進行分頁,這樣在GridView指定資料來源為ObjectDataSource並允許分頁,設定分頁的網格就可以 分頁了,並且ObjectDataSource會自動的根據兩個引數MaximumRows, StartRowIndex來呈現GridView當前頁 面所要的資料,當然我們在業務層,資料訪問層,資料層都要對對應的SelectMethod方法實現引數MaximumRows, StartRowIndex

2)   GridView + PageIndexChanged事件

GridView有個PageIndexChanged事件,我們在頁面程式碼中增加處理PageIndexChanged事件的方法,然後根據GridView的PageIndex,PageSize屬性呼叫業務層相應的分頁方法然後繫結資料。

3)  Repeater + URL字串引數

GridView 是固定了的格式顯示資料,Repeater控制元件是一個數據顯示控制元件,該控制元件允許通過為列表中顯示的每一項重複使用指定的模板來自定義佈局。但是 Repeater沒有內建的分頁功能。沒有內建的分頁功能,我們就要輔助實現它,常見的解決方案有,用URL字串引數傳遞資訊,然後在服務端資料傳遞過 來的資訊,然後進行資料繫結。

4)  資料控制元件 + AspNetPager分頁控制元件

分頁原理基本上一樣,而且UI元素 也差不多,無非就是前一頁,後一頁,第一頁,最後一頁,還有中間的幾頁,我們可以把這些都抽象出來,然後寫一個自定義控制元件分頁控制元件,分頁控制元件定義一些屬性 和事件,在要用到分頁的頁面直接呼叫這個控制元件就可以了,根據分頁控制元件所發生的事件呼叫業務層資料並繫結資料控制元件。