asp.net mvc 分页控件 MvcPager修改;使用范围增大
其实也没什么,就是记录下来和大家分享下。
做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 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>的转换。于是乎也不管类名规不规范了,加了下面代码:
{
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还是大有人用啊。所以还是得考虑进去啊。(如有不对,欢迎指证,发现已晚,马上下架)