西宁网站建设公司排行,网站查询域名ip解析,平面设计培训班学费一般多少百度贴吧,百度推广上班怎么样ABP入门系列目录——学习Abp框架之实操演练源码路径#xff1a;Github-LearningMpaAbp 完成了任务清单的增删改查#xff0c;咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现#xff0c;实在是贴心啊。 来来来#xff0c;这一节咱们就来捋一捋如… ABP入门系列目录——学习Abp框架之实操演练源码路径Github-LearningMpaAbp 完成了任务清单的增删改查咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现实在是贴心啊。 来来来这一节咱们就来捋一捋如何使用ABP的进行分页吧。
1. 分页请求DTO定义 数据传输对象(Data Transfer Objects)用于应用层和展现层的数据传输。 展现层传入数据传输对象(DTO)调用一个应用服务方法接着应用服务通过领域对象执行一些特定的业务逻辑并且返回DTO给展现层。这样展现层和领域层被完全分离开了。在具有良好分层的应用程序中展现层不会直接使用领域对象(仓库实体)。 我们在展现层有分页请求时一般需要指定两个参数一个用来标志第几页、一个是每页行数一般有配置文件配置。 因为分页是一个很常用的功能所以展现层我们有分页请求时最好有相应的DTO来封装这两个参数。 在ABP源码中并没有为我们封装这样公用的类但是在ABPZero项目中定义了相应的分页Dto。 对应的类图如下 分页排序过滤相应Dto类图
从中可以看到主要包括以下四个公共DTO定义
PagedInputDto分页请求DtoPagedAndSortedInputDto分页排序DtoPagedSortedAndFilteredInputDto分页排序过滤DtoPagedAndFilteredInputDto分页过滤Dto
是不是很实用我们的分页一般是和过滤排序混合使用的。
其中主要定义了以下几个主要属性
MaxResultCount每页行数可以从定义的配置中读取。SkipCount跳转数量一般计算公式为SkipCountPage*MaxResultCount页数*行数。Filter过滤字符串Sorting排序方式
具体的实现就不详述了相信仔细看类图就能自己动手实现。AbpZero把这些公共Dto定义在了应用服务层的Dto文件夹下具体路径如下图。 2. 如何使用分页DTO
拿我们的任务清单举例我们修改下创建的GetTaskInputDto让它继承自PagedSortedAndFilteredInputDto这样GetTaskInputDto就拥有了进行分页排序过滤需要用到的属性。 public class GetTasksInput : PagedSortedAndFilteredInputDto
{public TaskState? State { get; set; }public int? AssignedPersonId { get; set; }
}3. 返回分页结果DTO
Abp已经为我们定义了泛型的PagedResultDto用来包装返回的分页结果。其中主要包括两个属性int TotalCount保存总个数IReadOnlyListT Items保存返回的分页结果集。
4. 应用服务层分页逻辑实现
1、 在ITaskAppService中定义接口PagedResultDtoTaskDto GetPagedTasks(GetTasksInput input); 2、 在TaskAppService中实现接口 public PagedResultDtoTaskDto GetPagedTasks(GetTasksInput input)
{//初步过滤var query _taskRepository.GetAll().Include(t t.AssignedPerson).WhereIf(input.State.HasValue, t t.State input.State.Value).WhereIf(!input.Filter.IsNullOrEmpty(), t t.Title.Contains(input.Filter)).WhereIf(input.AssignedPersonId.HasValue, t t.AssignedPersonId input.AssignedPersonId.Value);//排序query !string.IsNullOrEmpty(input.Sorting) ? query.OrderBy(input.Sorting) : query.OrderByDescending(t t.CreationTime);//获取总数var tasksCount query.Count();//默认的分页方式//var taskList query.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();//ABP提供了扩展方法PageBy分页方式var taskList query.PageBy(input).ToList();return new PagedResultDtoTaskDto(tasksCount,taskList.MapToListTaskDto());
}分页的实现很简单先进行过滤排序再进行分页最后使用PagedResultDto封装分页结果。 细心的你也许发现了两个未曾在Linq中用过的方法WhereIf和PageBy是的这是ABP提供的扩展方法感兴趣的可以看下源码QueryableExtensions的具体实现其实实现的很简单但我们平时在使用linq时却未必能想得到。
在这里提几个问题
请问在这段代码中共进行了几次查询代码中使用的是什么分页技术真分页假分页
5. 使用X.PagedList进行前端分页
在Asp.Net Mvc中进行前端分页有一系列开源实现在我的Demo中使用的是开源的X.PagedList分页。想了解具体源码请参考X.PagedList GitHub。
1、请自行在Web项目中安装X.PagedList.Mvc Nuget程序包 X.PagedList.Mvc Nuget程序包
2、在Controller中使用X.PagedList提供的方法构造分页结果供前端使用 因为我们在应用服务层已经手动实现了分页逻辑所以按照X.PagedList官网示例我们需要自行构造StaticPagedList作为返回结果。 public ActionResult PagedList(int? page){//每页行数var pageSize 5;var pageNumber page ?? 1;//第几页var filter new GetTasksInput{SkipCount (pageNumber - 1) * pageSize,//忽略个数MaxResultCount pageSize};var result _taskAppService.GetPagedTasks(filter);//已经在应用服务层手动完成了分页逻辑所以需手动构造分页结果var onePageOfTasks new StaticPagedListTaskDto(result.Items, pageNumber, pageSize, result.TotalCount);//将分页结果放入ViewBag供View使用ViewBag.OnePageOfTasks onePageOfTasks;return View();
}从代码中可以看到我们构造完X.PagedList提供的分页结果后放入了ViewBag中供视图使用。
3、View中添加分页控件 PagedList视图的代码如下 using X.PagedList.Mvc;
using Abp.Web.Mvc.Extensions
using X.PagedList;
link href~/Content/PagedList.css relstylesheet /
ul classlist-groupforeach (var task in ViewBag.OnePageOfTasks){li classlist-group-itemdiv classbtn-group pull-rightbutton typebutton classbtn btn-infoEdit/buttonbutton typebutton classbtn btn-successDelete/button/divdiv classmediaa classmedia-left href#*i classfa Model.GetTaskLable(task) fa-3x/i*/adiv classmedia-bodyh4 classmedia-headingtask.Title/h4span classtext-mutedtask.CreationTime.ToString(yyyy-MM-dd HH:mm:ss)/span/div/div/li}
/ulHtml.PagedListPager((IPagedList)ViewBag.OnePageOfTasks, page Url.Action(PagedList, new { page }))其中最后一句代码是用来生成分页控件。
最终效果如图 总结
本节主要讲解了如何使用ABP进行后台分页并顺带讲解了ABP后台分页逻辑的实现方式。同时也演示了如何使用X.PagedList进行前端分页。 作者圣杰 链接https://www.jianshu.com/p/19b666a4b8b1 来源简书 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。