>  기사  >  백엔드 개발  >  ABP 입문 시리즈의 페이징 기능 구현 방법 소개

ABP 입문 시리즈의 페이징 기능 구현 방법 소개

高洛峰
高洛峰원래의
2017-03-19 10:34:112894검색

이 섹션에서는 주로 백그라운드 페이징에 ABP를 사용하는 방법을 설명하고 ABP 백그라운드 페이징 로직 구현에 대해서도 설명합니다. 프론트엔드 페이징을 위해 X.PagedList를 사용하는 방법도 보여줍니다

작업 목록의 추가, 삭제, 수정, 확인을 마친 후, 필수적인 페이징 기능에 대해 이야기해보겠습니다.

우선, ABP가 정말 세심한 페이징 구현을 캡슐화하는 데 도움을 준 것을 매우 기쁘게 생각합니다.

자, 이 섹션에서는 페이징에 ABP를 사용하는 방법을 살펴보겠습니다.

1. 페이징 요청 DTO 정의

데이터 전송객체(데이터 전송 객체 )은 애플리케이션 계층과 프리젠테이션 계층에서 데이터 전송에 사용됩니다.

프레젠테이션 계층은 DTO(데이터 전송 개체)를 전달하여 애플리케이션 서비스 메서드를 호출한 다음 애플리케이션 서비스가 도메인 개체를 통해 특정 비즈니스 로직을 실행하고 DTO를 프레젠테이션 계층에 반환합니다. 이러한 방식으로 프리젠테이션 계층과 도메인 계층이 완전히 분리됩니다. 계층이 잘 구성된 애플리케이션에서 프레젠테이션 계층은 도메인 개체(웨어하우스, 엔터티)를 직접 사용하지 않습니다.

프리젠테이션 레이어에서 페이징 요청이 있는 경우 일반적으로 두 개의 매개변수를 지정해야 합니다. 하나는 페이지를 표시하는 데 사용되고 다른 하나는 페이지당 줄 수입니다(일반적으로 구성 파일 구성).

페이징은 매우 일반적으로 사용되는 기능이므로 프레젠테이션 계층에서 페이징 요청이 있는 경우 해당 DTO를 사용하여 이 두 매개변수를 캡슐화하는 것이 가장 좋습니다.

ABP 소스 코드에는 이러한 공개 클래스가 캡슐화되어 있지 않지만 ABPZero 프로젝트에서는 해당 페이징 Dto가 정의되어 있습니다.

해당 클래스 다이어그램은 다음과 같습니다.

ABP 입문 시리즈의 페이징 기능 구현 방법 소개

해당 Dto 클래스 다이어그램을 페이지 정렬 및 필터링

한 것을 알 수 있습니다. 주로 다음 네 가지 일반적인 DTO 정의가 포함됩니다.

  1. PagedInputDto: 페이징 요청 Dto

  2. PagedAndSortedInputDto: 페이징 정렬 Dto

  3. PagedSortedAndFilteredInputDto :페이지 정렬 필터 Dto

  4. PagedAndFilteredInputDto: 페이징 필터 Dto

우리의 페이징은 일반적으로 혼합되어 있습니까? 필터링과 정렬로.

다음 주요 속성이 주로 정의됩니다.

  • MaxResultCount: 정의된 구성에서 읽을 수 있는 페이지당 행 수 .

  • SkipCount: 점프 횟수. 일반적인 계산 공식은 SkipCount=Page*MaxResultCount(페이지 수*행 수)입니다.

  • 필터: 필터 문자열

  • 정렬: 정렬 기준

구체적인 구현에 대해서는 자세히 설명하지 않겠습니다. 클래스 다이어그램을 주의 깊게 살펴보면 직접 구현할 수 있을 것입니다. AbpZero는 이러한 공용 Dto를 애플리케이션 서비스 계층의 Dto 폴더에 정의합니다. 구체적인 경로는 다음과 같습니다.

ABP 입문 시리즈의 페이징 기능 구현 방법 소개

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는 총 개수를 저장하고 IReadOnlyList Items는 반환된 페이징 결과 집합을 저장합니다.

4. 애플리케이션 서비스 계층 페이징 로직 구현

1. ITaskAppService에서 인터페이스

PagedResultDto<TaskDto> GetPagedTasks(GetTasksInput input);


2. TaskAppService에서 인터페이스를 구현합니다.


public PagedResultDto<TaskDto> 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 PagedResultDto<TaskDto>(tasksCount,taskList.MapTo<List<TaskDto>>());
}


페이징 구현은 매우 간단합니다. 먼저 필터링, 정렬, 페이징을 수행하고 마지막으로 PagedResultDto를 사용하여 페이징 결과를 캡슐화합니다.

주의 깊게 살펴보면 Linq에서 한 번도 사용하지 않은

WhereIf 두 가지 방법을 찾을 수 있습니다. 네, ABP에서 제공하는 확장 방법입니다. 소스코드를 보세요 PageBy의 구체적인 구현은 사실 매우 간단하지만, 보통 linq를 사용할 때는 생각하지 못할 수도 있습니다. QueryableExtensions

몇 가지 질문:

이 코드에서는 몇 개의 쿼리가 수행되었습니까?

代码中使用的是什么分页技术?(真分页?假分页?)

5. 使用X.PagedList进行前端分页

Asp.Net Mvc中进行前端分页有一系列开源实现,在我的Demo中使用的是开源的X.PagedList分页。想了解具体源码,请参考X.PagedList GitHub。

1、请自行在Web项目中安装X.PagedList.Mvc Nuget程序包

ABP 입문 시리즈의 페이징 기능 구현 방법 소개

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 StaticPagedList<TaskDto>(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" rel="external nofollow" rel="stylesheet" />
<ul class="list-group">
 @foreach (var task in ViewBag.OnePageOfTasks)
 {
  <li class="list-group-item">
   <p class="btn-group pull-right">
    <button type="button" class="btn btn-info">Edit</button>
    <button type="button" class="btn btn-success">Delete</button>
   </p>
   <p class="media">
    <a class="media-left" href="#" rel="external nofollow" >
     @*<i class="fa @Model.GetTaskLable(task) fa-3x"></i>*@
    </a>
    <p class="media-body">
     <h4 class="media-heading">@task.Title</h4>
     <span class="text-muted">@task.CreationTime.ToString("yyyy-MM-dd HH:mm:ss")</span>
    </p>
   </p>
  </li>
 }
</ul>
@Html.PagedListPager((IPagedList)ViewBag.OnePageOfTasks, page => Url.Action("PagedList", new { page }))

其中最后一句代码是用来生成分页控件。

最终效果如图:

ABP 입문 시리즈의 페이징 기능 구현 방법 소개总结

总结

本节主要讲解了如何使用ABP进行后台分页,并顺带讲解了ABP后台分页逻辑的实现方式。同时也演示了如何使用X.PagedList进行前端分页。

위 내용은 ABP 입문 시리즈의 페이징 기능 구현 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.