天天看點

【自然架構】QuickPager分頁控件的總體介紹和線上示範

QuickPager分頁控件的特點

 兩種運作方式:自動運作、手動運作。前者便捷,後者靈活。

 多種分頁方式:Postback、Postback僞URL、URL、URL重寫、Ajax For伺服器控件僞URL。

 多種分頁算法:Max、颠倒Top(優化版)、Row_Number、自動适應等。可以應對多種資料庫和各種需求。

 支援多種資料顯示控件:GridView、DataList、Repeater等控件。有DataSource和DataBind()的控件都支援。

 不需要存儲過程,但是仍然可以保證高效率!

 分頁方式、分頁算法、顯示資料控件,都可以通過屬性來“一鍵”切換。

 URL分頁方式裡支援直接提取記錄集,目前支援DataTable和WebList2(一個固定的實體類)。

 Postback分頁方式,支援直接通過URL參數(?page=3)通路指定頁号(比如第3頁)的記錄。

 URL分頁方式,支援自定義URL參數,直接添加即可,不用設定屬性。 

 生成SQL的類庫(QuickPagerSQL)。

 自動運作方式裡,可以通過實作接口的方式更換其他的“資料通路類庫”。

下面是詳細介紹和線上示範位址

運作方式——自動運作

  這個就好比自動洗衣機,放好衣物、洗衣粉,做好選項,然後啟動洗衣機。洗衣機就會自動按照步驟來洗衣服了,我們可以忙其他的事情了。很友善和節省時間。

QuickPager分頁控件的自動運作方式也是一樣,設定好屬性就可以了,資料提取、資料綁定、回發事件處理,都可以不用去管。非常便捷,這個在一起也介紹過了。

QuickPager分頁控件也設定了兩個事件,在控件綁定前和綁定後觸發,以友善我們實作一些特殊需求。如果隻是一般的分頁的話,那麼就不用去管這兩個事件了。

運作方式——手動運作

  自動運作方式很友善,但是也失去了一些靈活性,而且給人一種“高耦合”、違反單一職責的感覺。這個确實是确定。

那麼怎麼辦呢?我們可以選擇“手動運作”。這種方式下,分頁控件隻負責頁面的顯示(上一頁、下一頁、頁号導航、記錄數、頁數等)和事件的觸發(還有其他的一些,比如URL的參數處理等)。其他的功能都可以按照您喜歡的方式來處理。比如如何提取資料,提取哪裡的資料,如何綁定等等。這樣就增加了QuickPager分頁控件的靈活性。

分頁方式——Postback

  這個适合背景管理類的項目,比如網站背景管理、OA、CRM等。一個最大的優點就是可以很友善的保留用的輸入的查詢條件。

支援直接擷取指定頁号的記錄。

  可能您認為使用postback分頁,第一次通路隻能看到第一頁的資料,想在第一次通路就看到其他頁的資料就實作不了的。這是個誤區,其實是可以實作的,隻是QuickPager是可以實作的。通過list.aspx?page=3 這樣的連接配接,就可以看到第三頁的記錄。當然進入後還是可以正常翻頁,看其他的頁面。

分頁方式——Postback僞URL

  如果在網頁裡面使用Postback來分頁的話,那麼對于搜尋引擎就很不友好了。那麼怎麼辦呢?除了可以采用URL的方式來分頁之外,還可以用這種僞URL的分頁方式。

  我們可以對比一下兩個連接配接方式。

Postback的連接配接:

<a  href="javascript:__doPostBack('Pager1',2)">下一頁</a>

僞URL的連接配接:

<a  href="PsotURL.aspx?page=7" onclick="javascript:__doPostBack('Pager1',7);return false;">下一頁</a>

  原理也很簡單,就是把原來放在href裡的js函數,放在了onclick事件裡面,然後加上return false。再把href裡的連接配接按照URL的方式來寫就可以了。

  這樣對于搜尋引擎來說,是一個可以通路的連接配接。對于使用者來說,起作用的是那個js函數。這樣即可以照顧搜尋引擎,又可以利用Postback的保留查詢條件的優勢了。

  當然這個并不是一個很好的解決方法,更好的是ajax僞URL,不過這個難度要高一點。Postback僞URL,完全可以用Postback的方式來寫,對于習慣這種方式的人來說,就比較舒服了。

分頁方式——URL

  這個适合在網頁裡使用,優點是搜尋引擎可以識别,當然收不收錄是另一個話題了,至少是可以識别的。

QuickPager分頁控件在URL分頁方式裡有一個很友善的地方——可以自動保留URL裡面的參數。實作這個功能并不需要設定什麼屬性,完全自動的。比如 list.aspx?page=2&kind=3&area=10 。在翻頁的時候,kind=3、area=10這類的參數都會被自動保留(傳遞下去)。當然其他的參數也都可以。如果感興趣的話,您可以通過下面的連接配接位址自己測試一下。

  請注意:page 這個參數是分頁控件專用的,您自己的參數請使用其他的名稱。

分頁方式——URL重寫

  這個是完全為了搜尋引擎而做的。有人說,這麼做并不會給收錄帶來什麼好處,完全是一樣的。但是現在比較流行這個,有一些人喜歡,那麼作為一個分頁控件來說,支援這種分頁方式也就是必須的了。

  可以通過屬性來設定頁面名稱,預設是list{0}.aspx ,{0}代表頁号。您可以設定成list_{0}.html 等方式。

分頁方式——Ajax For伺服器控件僞URL

  這個名稱比較長。Ajax是剛加入的一個功能,目前還不太完善。這個是針對postback的分頁方式,也就是針對伺服器控件來做的。基于jQuery.ajax實作,沒有用asp.net 的ajax控件。還有一個優點就是可以通過修改屬性,切換成其他的分頁方式。

  如果您的程式裡使用伺服器控件(GridView)來顯示資料,老闆(客戶)聽說了Ajax,于是要求項目裡都要改成ajax的方式。那麼您就可以采用這種方式了。原來的程式不用改,隻需要換成QuickPager分頁控件,選擇AjaxForWebControl方式即可,其他的代碼就不用改了。除了GridView控件之外,其他控件也是支援的。

  當然,這個也不是很好的方案,隻是一個比較應付的,暫時頂一會的方法。

分頁方式 —— 一鍵切換

  這麼多的分頁方式,看起來有點亂,其實是很友善管理的。可以通過修改PagerTurnKind屬性來切換分頁方式,其他屬性的設定都是一樣的。

分頁算法:

  分頁算法,就是提取分頁資料用的SQL。因為一些資料庫不能通過一條簡單的SQL來擷取指定頁号的記錄,是以需要一些小技巧。我習慣上把這種SQL就叫做分頁算法了。也不知道這種叫法是否正确。

  分頁算法是通過屬性設定,在運作是動态拼接出來的。不需要存儲過程。有多種分頁算法可供選擇,多種分頁算法可以支援不同的資料庫和不同的需求。比如如果是SQL Server2005,那麼就可以選擇Row_number的分頁算法,SQL Server2000就不能選擇這個算法了。MySQL可以選擇limit,隻是其他資料庫就不支援了。提供了 多種算法就可以應對不同的資料庫了。

Max:

  這個比較常見了,優點是寫起來比較簡單,缺點是子能單字段排序,不能多字段排序。

颠倒Top(優化版):

  颠倒Top,雖然寫起來比較複雜,但是效率并不是像想象中的那麼差,他的優點是支援多字段排序,效率也不錯。而且QuickPager采用的颠倒Top還做了優化,效率更佳。同時修改了一個bug,即顯示最後一頁多記錄的情況。

Row_Number:

  這個是針對SQL Server2005的,不多說了。

自動适應:

  Max隻能是單字段排序,颠倒Top支援多字段排序,但是如果單字段排序的話,就有點浪費了。如果一開始是單字段排序,後來變成了多字段排序,怎麼辦?自動适應就是解決這樣的問題,設定後,會根據排序字段的數量來選擇是Max還是颠倒Top。這樣就更友善了。

分頁算法 —— 一鍵切換

  同上,隻需要修改SetPagerSQLKind屬性即可切換分頁算法,其他的屬性設定都是一樣的。

多種資料顯示控件

  背景管理裡常見的就是GridView了,以前是DataGrid。前台網頁裡是Repeater和DataList。還有。Net2.0裡的DetailsView、FormView也是支援的,理論上DropDownList、ListBox等也是支援的,隻是似乎這些控件不需要分頁。

無需存儲過程。

  一提到分頁,您可能想到的是   存儲過程,(其實是吳旗娃的那個分頁控件吧)。可是大多數情況都是在存儲過程裡面拼接SQL來實作分頁功能的,這樣做存儲過程的優勢就一點都優勢都展現不出來了。預編譯、緩存執行計劃這兩個是存儲過程的優勢,但那是對在存儲過程裡面直接寫SQL來說的。

  是以與其在存儲過程裡面拼接SQL,不如寫個類庫來管理。QuickPagerSQL就是這樣的類庫。上面說的幾種分頁算法,他都可以根據屬性,在運作時動态拼接出來。這樣我們隻需要關心表名/視圖名、排序字段、查詢條件等就可以了,至于什麼樣的分頁算法,讓QuickPagerSQL來生成就可以了。

  URL分頁裡,可以直接擷取DataTable,這樣我們可以直接在頁面裡周遊DataTable了。當然如果你不喜歡可以不用的。我是比較喜歡這種方式的。

另外還可以直接擷取一個實體類——WebList2。這個是我自定義的一個類,他是根據衆多清單頁面的特點而設計的。這裡就先不詳細說了,以後在細說。

一個接口

  在自定運作方式下,會使用QuickPagerSQL來生成需要的SQL,然後通過DataAccessLibrary來送出給資料庫。如果你不喜歡這個資料通路函數庫,那麼怎麼辦呢?您可以實作這個接口,換成你自己的資料通路方式。

  有了這個接口,至少在理論上支援更換其他的資料通路類庫了。

  您可能會問了,QuickPagerSQL有沒有接口?目前還沒有設計這方面的接口,因為目前還沒有發現有類似功能的類庫,設計了也沒得可換。當然也可能是我孤陋寡聞了。

使用前,需要在web.config裡面注冊控件和連結字元串

【自然架構】QuickPager分頁控件的總體介紹和線上示範
【自然架構】QuickPager分頁控件的總體介紹和線上示範

代碼

<?xml version="1.0"?>

<configuration>

  <!--URL重寫的設定,居然必須是第一個-->

  <configSections>

    <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />

  </configSections>

  <appSettings>

    <add key="DataBaseType" value="1"/>

    <add key="PagerSQLKey" value="63432870"/>

  </appSettings>

  <connectionStrings>

    <add name="ConnectionString" connectionString="Data Source=.;Initial Catalog=Nature_Demo;persist security info=False;user id=sa;pwd=admin;" providerName="System.Data.SqlClient"/>

  </connectionStrings>

  <!--重寫規則-->

  <RewriterConfig>

    <Rules>

      <!--URL重寫的示範-->

      <RewriterRule>

        <LookFor>~/QuickPager/URL/list(\d+)\.aspx</LookFor>

        <SendTo>~/Nonline/QuickPager/URL/URLRewriter.aspx?page=$1</SendTo>

      </RewriterRule>

    </Rules>

  </RewriterConfig>

  <system.web>

    <!--URL重寫的設定-->

    <httpHandlers>

      <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />

    </httpHandlers>

    <pages>

      <!--注冊自定義控件-->

      <controls>

        <add assembly="Nature.WebControls" namespace="Nature.WebControls" tagPrefix="Nature"/>

      </controls>

    </pages>

        <compilation debug="true" tempDirectory="t:\" />

        <authentication mode="Windows"/>

      </system.web>

  </configuration>