关于Oxite的分页实现机制
2009-12-07 18:37
316 查看
关键的类型:
1、IPageOfList<T>,其定义如下:
public interface IPageOfList<T> : IList<T>
{
int PageIndex { get; }
int PageSize { get; }
int TotalPageCount { get; }
int TotalItemCount { get; }
}
在DDD(领域驱动设计,在没有去看这个之前,我本不知道Oxite整体上为什么会是现在这个样子的)中就是值对象了。这个接口有一个具体实现,是PageOfList<T>,这个类同时集成了List<T>接口,而且,这个类型也是一个值对象,是用来保存本次分页的数据项,还有当前的分页状态的类型。
public PageOfList(IEnumerable<T> items, int pageIndex, int pageSize, int totalItemCount)
{
AddRange(items); //List<T>提供的方法,把各个项添加进去,然后设置相应的分页状态。
PageIndex = pageIndex;
PageSize = pageSize;
TotalItemCount = totalItemCount;
TotalPageCount = (int)Math.Ceiling(totalItemCount / (double)pageSize);
}
2、IQueryableExtensions
public static class IQueryableExtensions
{
public static PageOfList<T> GetPage<T>(this IQueryable<T> query, int pageIndex, int pageSize)
{
return new PageOfList<T>(query.Skip(pageIndex * pageSize).Take(pageSize), pageIndex, pageSize, query.Count());
}
}
定义了有一个拓展方法,返回对于数据仓储查询结果的一个PageOfList<T> 对象。
3、
接下来我们以Post类型为例,进行如下分析:IPostService的一些方法定义
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, DateTime? sinceDate);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, Tag tag, DateTime? sinceDate);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, Area area, DateTime? sinceDate);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, ArchiveData archive);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, SearchCriteria criteria, DateTime? sinceDate);
IPageOfList<Post> GetPostsWithDrafts(int pageIndex, int pageSize);
看看IPostServices的定义,我们可以看到,获取Posts列表返回的对象就是IPageOfList<T>类型。其实一开始看到这我觉得很奇怪,怎么IQueryable<T>能转换成IPageOfList<T>类型呢?其实这两个接口都继承了IEnumerable<T>。
接下来,阅读View/Post/List.aspx的代码,我们可以发现,这个页面引用了
Oxite.Model.Extensions和Oxite.Mvc.Extensions这两个拓展方法的命名空间。
Oxite.Mvc.Extensions里面有HtmlHelperExtensions拓展了HtmlHelper,其中,有Pager相关的拓展方法。
我们仔细看,会发现有这么一句,
<%=Html.PageState((IPageOfList<Post>)Model.List, (k, v) => Model.Localize(k, v))%> //{0}-{1} of {2} {0}是当前的页索引,{1}是当前pagesize的最后一页,{2}是总的页数。
<% Html.RenderPartial("PostListMedium"); %> //以中等大小输出Post标题以及ShortBody。
<%=Html.PostListPager((IPageOfList<Post>)Model.List, (k,v) => Model.Localize(k,v)) %> //列出页码,还有显示前一页、下一页
具体例子,参考这个,http://visitmix.com/Articles,也就是mix online,Oxite学习的好地方。
1、IPageOfList<T>,其定义如下:
public interface IPageOfList<T> : IList<T>
{
int PageIndex { get; }
int PageSize { get; }
int TotalPageCount { get; }
int TotalItemCount { get; }
}
在DDD(领域驱动设计,在没有去看这个之前,我本不知道Oxite整体上为什么会是现在这个样子的)中就是值对象了。这个接口有一个具体实现,是PageOfList<T>,这个类同时集成了List<T>接口,而且,这个类型也是一个值对象,是用来保存本次分页的数据项,还有当前的分页状态的类型。
public PageOfList(IEnumerable<T> items, int pageIndex, int pageSize, int totalItemCount)
{
AddRange(items); //List<T>提供的方法,把各个项添加进去,然后设置相应的分页状态。
PageIndex = pageIndex;
PageSize = pageSize;
TotalItemCount = totalItemCount;
TotalPageCount = (int)Math.Ceiling(totalItemCount / (double)pageSize);
}
2、IQueryableExtensions
public static class IQueryableExtensions
{
public static PageOfList<T> GetPage<T>(this IQueryable<T> query, int pageIndex, int pageSize)
{
return new PageOfList<T>(query.Skip(pageIndex * pageSize).Take(pageSize), pageIndex, pageSize, query.Count());
}
}
定义了有一个拓展方法,返回对于数据仓储查询结果的一个PageOfList<T> 对象。
3、
接下来我们以Post类型为例,进行如下分析:IPostService的一些方法定义
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, DateTime? sinceDate);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, Tag tag, DateTime? sinceDate);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, Area area, DateTime? sinceDate);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, ArchiveData archive);
IPageOfList<Post> GetPosts(int pageIndex, int pageSize, SearchCriteria criteria, DateTime? sinceDate);
IPageOfList<Post> GetPostsWithDrafts(int pageIndex, int pageSize);
看看IPostServices的定义,我们可以看到,获取Posts列表返回的对象就是IPageOfList<T>类型。其实一开始看到这我觉得很奇怪,怎么IQueryable<T>能转换成IPageOfList<T>类型呢?其实这两个接口都继承了IEnumerable<T>。
接下来,阅读View/Post/List.aspx的代码,我们可以发现,这个页面引用了
Oxite.Model.Extensions和Oxite.Mvc.Extensions这两个拓展方法的命名空间。
Oxite.Mvc.Extensions里面有HtmlHelperExtensions拓展了HtmlHelper,其中,有Pager相关的拓展方法。
我们仔细看,会发现有这么一句,
<%=Html.PageState((IPageOfList<Post>)Model.List, (k, v) => Model.Localize(k, v))%> //{0}-{1} of {2} {0}是当前的页索引,{1}是当前pagesize的最后一页,{2}是总的页数。
<% Html.RenderPartial("PostListMedium"); %> //以中等大小输出Post标题以及ShortBody。
<%=Html.PostListPager((IPageOfList<Post>)Model.List, (k,v) => Model.Localize(k,v)) %> //列出页码,还有显示前一页、下一页
具体例子,参考这个,http://visitmix.com/Articles,也就是mix online,Oxite学习的好地方。
相关文章推荐
- Oxite分页机制的实现的一点补充
- 关于DataList使用DropDownList的分页实现 技巧实例源码
- ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
- 关于android的广播机制里面的网络状态监听 (Fragment实现)
- 一个关于Oracle分页的实现方案
- 关于存储过程实现分页的技术
- 关于Session的机制,实现方式和安全、单点故障问题
- 关于PHP弹层上再次实现无刷新分页的看法
- PHP开发中关于分页功能实现的代码实例一则
- QT中关于信号与槽机制的实现原理
- [置顶] 关于网站多语言机制的实现的原型demo
- 关于boost::asio::async_write的实现机制
- QT中关于信号与槽机制的实现原理
- 关于DataTable分页方案的实现
- 关于分页的一种实现方式--(js实现)
- 01.关于使用Hibernate技术实现分页显示的思考总结
- 《Orange's 一个操作系统的实现》学习笔记--分页机制
- 关于使用SSH框架分页的实现以及容易出错的地方
- JavaWeb开发中关于分页的实现
- QT中关于信号与槽机制的实现原理