ABP入门系列中分页功能的实现
完成任务列表的增加、删除和修改后,我们再来说说必不可少的分页功能。
首先,我很高兴ABP为我们封装了分页实现,真的很贴心。
来吧,让我们在这一节复习一下如何使用ABP进行分页。
1.寻呼请求DTO定义
数据传输对象用于应用层和表示层的数据传输。
表示层通过传入的数据传输对象(DTO)调用应用服务方法,然后应用服务通过域对象执行一些特定的业务逻辑,并将DTO返回给表示层。这样,表示层和领域层就完全分离了。在分层良好的应用程序中,表示层不直接使用域对象(仓库、实体)。
当表示层中有分页请求时,我们通常需要指定两个参数,一个用于标记页码,另一个用于每页的行数(通常由配置文件配置)。
分页是一个非常常见的功能,所以当我们在表示层有分页请求的时候,最好有对应的DTO来封装这两个参数。
这个公共类并没有在ABP源代码中为我们封装,但是在ABPZero项目中定义了相应的分页Dto。
对应的类图如下:
分页排序过滤相应的Dto类图
可以看出,有四种公开的DTO定义:
PagedInputDto:分页请求Dto PagedAndSortedInputDto:分页排序Dto pagedandsfilteredinputo:分页排序过滤器Dto pagedandsfilteredinputo:分页过滤Dto是否非常实用,我们的分页一般都是混合过滤排序的。
主要定义了以下主要属性:
MaxResultCount:每页的行数,可以从定义的配置中读取。SkipCount:跳跃的次数。一般计算公式为SkipCount=Page*MaxResultCount。Filter:过滤字符串排序:排序方式的具体实现不再赘述。我相信你可以通过仔细看类图自己做。AbpZero在应用服务层的DTO文件夹中定义了这些公共dto,具体路径如下。
2.如何使用寻呼DTO
以我们的任务列表为例,我们修改了创建的getaskinputto,使其继承自PagedSortedAndFilteredInputDto,从而使getaskinputto具有分页排序和筛选所需的属性。
公共类GetTasksInput : pagedsortandfilteredintto { public TaskState?状态{ get设置;} public int?AssignedPersonId { get设置;}}3.返回寻呼结果DTO
Abp为我们定义了一个通用的PagedResultDto来包装返回的分页结果。它主要包括两个属性,int TotalCount保存总数,ireadonlystitems保存返回的分页结果集。
4.应用服务层分页逻辑的实现
1.在ITaskAppService中定义接口
page dresultdtotaskto getpage dtasks(GetTasksInput输入);2.在TaskAppService中实现接口:
public page dresultdtotaskto getpagedttasks(gettasksinput input){//初步筛选varquery=_ task repository . getall()。包括(t=指定人员)。WhereIf(输入。状态。哈希值,t=t。状态==输入。状态.值)。WhereIf(!输入。Filter.IsNullOrEmpty(),t=t.Title.Contains(输入。过滤器))。WhereIf(输入。AssignedPersonId.HasValue,t=t.AssignedPersonId==input。已分配的个人标识值);//排序查询=!字符串。IsNullOrEmpty(输入。排序)?查询。OrderBy(输入。排序):查询。OrderByDescending(t=t . creation time);//获取总数var tasksCount=query。count();//默认分页模式//var tasklist=query。跳过(输入。skipcount)。take(输入。maxresultcount)。to list();//ABP提供扩展方法PageBy分页模式var tasklist=query。逐页(输入)。to list();返回新页面。maptolistaskto());}分页的实现非常简单,先过滤,再排序,然后分页,最后用PagedResultDto封装分页结果。
小心,你可能会发现两个从未在Linq中使用过的方法,WhereIf和PageBy。是的,这是ABP提供的扩展方法。如果您感兴趣,您可以看到源代码QueryableExtensions的具体实现。实际上,实现非常简单,但是我们在使用linq时可能想不到。
这里有几个问题:
这段代码中进行了多少次查询?
代码中使用了什么分页技术?(真的分页了?错误分页?)
5.使用X.PagedList进行前端分页
Asp.Net MVC中有一系列前端分页的开源实现,我的演示中使用了开源的X.PagedList分页。具体源代码请参考GitHub X . page dlist
1.请自行在Web项目中安装X.PagedList.Mvc Nuget包
X.页面列表. Mvc Nuget包
2.使用控制器中的X.PagedList提供的方法来构造供前端使用的分页结果
因为我们已经在应用服务层手动实现了分页逻辑,根据X.PagedList的官网示例,我们需要自己构造StaticPagedList作为返回结果。
public action result page dlist(int?Page) {//每页行数var page size=5;var pageNumber=page?1;//页码varfilter=new gettask input { skip count=(page number-1)* page size,//忽略数字MaxResultCount=page size };var result=_taskAppService。GetPagedTasks(筛选器);//分页逻辑已经在应用服务层手工完成,需要手工构造分页结果varonePageoftasks=new static pagedlisttaskto(result。项目,页码,页面大小,结果。total count);//将分页结果放入viewpag进行viewpag。one page of tasks=one page of tasks;返回视图();}从代码中我们可以看到,在构造了X.PagedList提供的分页结果后,我们将它们放入ViewBag中供视图使用。
3.在视图中添加分页控件
页面列表视图包含以下代码:
@使用X . PagedList.Mvc@使用Abp。Web . Mvc.Extensions @使用X . PagedListlink href=' ~/Content/page dlist . CSS ' rel=' external no follow ' rel='样式表'/ul class=' list-group ' @ foreach(var task in viewpag。OnePageOfTasks){ Li class=' list-group-item ' div class=' BTN-group pull-right '按钮类型=' button ' class=' BTN BTN-info ' edit/button button type=' button ' BTN BTN-success ' delete/button/div class=' media ' a class=' media-left ' href=' # ' rel=' externano follow ' @ * I class=' fa @ Model。gettaskbale(task)fa-3x '/I * @/a div class=' media-body ' H4 class='media-heading'@task.Title/H4 span class=' text-muted ' @ task。creation ontime . ToString(' yyyy-MM-DD hh :MM 3360s ')/span/div/div/Li }/ul @ Html。page dlistpager((ipaged list)viewpag。onepagetasks,page=url.action ('pagedlist,new {page}))最后一个代码用于生成分页控件。
最终效果如图所示:
摘要
摘要
本节主要说明如何使用ABP进行后台分页,并附带说明ABP后台分页逻辑的实现。它还演示了如何使用X.PagedList进行前端分页。
版权声明:ABP入门系列中分页功能的实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。