使用ASP.NET MVC查詢時,一直使用MvcPaging組件,雖然需要自定義MvcPaging.Pager才能達到我想要的效果,但在沒有較好的URL庫時,還是這么用。分頁的邏輯本來就不復雜,更重要的是最近發現了Flurl這個開源庫,所以采用Flurl制作一個DIY的分頁組件,核心是PagingModel文件,算法可能不是最優,但包含了主要的邏輯和實現關鍵點。由於在查詢方面,我使用以下實踐:
1.使用ViewModel封裝查詢參數
2.使用ViewModel作為View的Model類型
3.采用表單的GET方式提交查詢到Action
4.直接設置Url的參數提交查詢到Action
因此自制的分頁組件也在上述環境下應用。本來計算將查詢和分頁寫在一起,但是為了便於獨立演示分頁還是將分頁部分獨立出來。
1.首先使用String擴展方法包裝Flurl中的方法,便於以后更換其他庫。
2.自定義繼承自IHtmlString的對象PagingModel,這樣可以不依賴MVC的程序庫。
同時實現了IvalidatableObject接口,檢查PageSize異常。一些默認的參數可以配置成從配置文件(在ASP.NET MVC 系列:文件上傳的Demo有相關的代碼)或配置數據庫中讀取。
3.在ASP.NET MVC Razor中直接使用或使用HtmlHelper擴展方法包裝調用。
可以對類庫再次保證,引用ASP.NET MVC,這樣可以直接返回SelectList對象。
Action:
View:
4.可以不使用繼承自PagingModel的方式,直接在View中new 一個PagingModel方式:
5.效果演示:
(1)靠近首頁和末頁的鏈接數不足時,會向中間補全。博客園的導航就只處理了靠近首頁部分,沒有正確處理末頁部分。
(2)默認PageIndex和PageSize不會添加參數。Url中參數為空時會自動過濾掉。
更新:支持調用自定義Razor模板
代碼已經上傳到gitosc:http://git.oschina.net/myshare/AspNetPaging
組件已經上傳到nuget:https://www.nuget.org/packages/AspNetPaging/