其實也沒什麼,就是記錄下來和大家分享下。
做asp.net mvc 2.0 的項目,肯定要用到分頁功能了,上網搜了幾下。偶然間發現MvcPager分頁控制項,感覺要用的功能都有了非常喜歡啊。(PS:寫這個控制項的哥們是個個聽力有障礙的殘疾人,在此敬佩一下,視早日康複)
於是乎查看了一下使用方法,很簡單,如下:
在自己的linq查詢集合上.ToPagedList(pageIndex,pageSize)即可,果然很方便。馬上放到項目中使用,這時悲劇了。找不到ToPagedList(***)方法。分析原因ToPagedList應該是個擴充方法。我項目中沒有用到Linq,查詢全部是基本的ado.net reader返回的List<T>集合。感覺問題肯定出在這裡。沒有List<T>集合也就是IEnumerable<T>等的擴充方法。於是乎上網搜了下MvcPager源碼,哈哈。在codeplex看到了。感謝cnblogs、csdn、msdn、非誠勿擾啊。開源的,我頂開源啊。哈哈。
接下來就是下載了源碼,很小。開啟項目一眼就看到了一個類:PageLinqExtensions.cs ,字面理解肯定就是它啦;開啟看果然如此:
代碼
public static class PageLinqExtensions
{
public static PagedList<T> ToPagedList<T>
(
this IQueryable<T> allItems,
int pageIndex,
int pageSize
)
{
if (pageIndex < 1)
pageIndex = 1;
var itemIndex = (pageIndex-1) * pageSize;
var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
var totalItemCount = allItems.Count();
return new PagedList<T>(pageOfItems, pageIndex, pageSize, totalItemCount);
}
}
看這個擴充方法 ToPagedList<T>裡面的型別參數,IQueryable<T>沒錯了,所以不支援List<T>的轉換。於是乎也不管類名規不規範了,加了下面代碼:
代碼
public static PagedList<T> ToPagedList<T>(this IEnumerable<T> allItems,int pageIndex,int pageSize)
{
pageIndex=pageIndex<1?1:pageIndex;
var itemIndex=(pageIndex-1)*pageSize;
var pageOfItems = allItems.Skip(itemIndex).Take(pageSize);
var totalItemCount = allItems.Count();
return new PagedList<T>(pageOfItems, pageIndex, pageSize, totalItemCount);
}
重載了一個擴充方法,型別參數為IEnumerable<T>,這個重載用來支援List<T>的ToPagedList(***)分頁轉換。到此完事。項目測試可用。
PS:雖然現在Linq,Entity Framework 啥的越來越流行了,但是以前的ado.net還是大有人用啊。所以還是得考慮進去啊。(如有不對,歡迎指證,發現已晚,馬上下架)