ABP 입문 시리즈 의 페이지 기능 실현

임무 명세서 의 첨삭 과 수정 검 사 를 완 성 했 으 니,우리 가 없어 서 는 안 될 페이지 기능 을 이야기 합 시다.
우선 ABP 가 페이지 를 봉인 해 주 셔 서 다행 입 니 다.정말 마음 에 듭 니 다.
자,자,이 절 에서 ABP 를 어떻게 사용 하 는 지 페이지 를 훑 어 보 자.
1.페이지 별 DTO 정의 요청
데이터 전송 대상(Data Transfer Objects)은 응용 층 과 표현 층 의 데이터 전송 에 사용 된다.
표현 층 전송 데이터 전송 대상(DTO)은 응용 서비스 방법 을 호출 한 다음 에 응용 서 비 스 는 분야 대상 을 통 해 특정한 업무 논 리 를 집행 하고 DTO 로 표현 층 에 되 돌려 준다.이렇게 표현 층 과 영역 층 이 완전히 분리 되 었 다.양호 한 층 을 가 진 응용 프로그램 에서 표현 층 은 영역 대상(창고,실체)을 직접 사용 하지 않 는 다.
우 리 는 표현 층 에 페이지 요청 이 있 을 때 보통 두 개의 인 자 를 지정 해 야 합 니 다.하 나 는 몇 페이지 를 표시 하고 하 나 는 각 페이지 의 줄 수(일반적으로 프로필 설정 이 있 습 니 다)입 니 다.
페이지 를 나 누 는 것 은 매우 자주 사용 하 는 기능 이기 때문에 표현 층 이 우리 가 페이지 를 나 누 어 요청 할 때 해당 하 는 DTO 가 이 두 인 자 를 밀봉 하 는 것 이 좋 습 니 다.
ABP 소스 코드 에 서 는 이러한 공용 클래스 를 봉인 하지 않 았 으 나,ABPZero 프로젝트 에 서 는 해당 페이지 의 Dto 를 정의 하 였 습 니 다.
대응 하 는 유 도 는 다음 과 같다.

페이지 별 정렬 필터
이 를 통 해 다음 과 같은 네 개의 공공 DTO 정 의 를 볼 수 있다.
  • PagedInputDto:페이지 별 요청 Dto
  • PagedAndSortedInputDto:페이지 정렬 Dto
  • PagedSortedAndFilteredInputDto:페이지 정렬 필터 Dto
  • PagedAndFilteredInputDto:페이지 별 필터 Dto
  • 실 용적 이지 않 습 니까?우리 의 페이지 는 보통 필터 정렬 과 혼합 하여 사용 합 니 다.
    그 중에서 다음 과 같은 몇 가지 주요 속성 을 정의 했다.
  • MaxResultCount:각 페이지 의 줄 수 는 정 의 된 설정 에서 읽 을 수 있 습 니 다.
  • SkipCount:점프 수량,일반 계산 공식 은 SkipCount=Page*MaxResultCount(페이지 수*줄 수)입 니 다.
  • 필터:필터 문자열
  • 정렬:정렬 방식
  • 구체 적 인 실현 은 상술 하지 않 고 유 도 를 자세히 보면 스스로 실현 할 수 있 을 것 이 라 고 믿는다.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 는 돌아 오 는 페이지 결 과 를 포장 하기 위해 일반적인 Paged ResultDto 를 정 의 했 습 니 다.그 중에서 주로 두 개의 속성 을 포함 하 는데 int TotalCount 는 총 개 수 를 저장 하고 IReadOnly ListItems 는 되 돌아 오 는 페이지 결과 집합 을 저장 합 니 다.
    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>>());
    }
    페이지 의 실현 은 매우 간단 하 다.먼저 여과,정렬 을 한 다음 에 페이지 를 나 누고 마지막 으로 Paged ResultDto 를 사용 하여 페이지 결 과 를 봉인 한다.
    세심 한 당신 은 Linq 에서 사용 하지 않 은 두 가지 방법WhereIfPageBy을 발 견 했 을 지도 모 릅 니 다.예,이것 은 ABP 가 제공 하 는 확장 방법 입 니 다.관심 있 는 것 은 소스 코드QueryableExtensions의 구체 적 인 실현 을 볼 수 있 습 니 다.사실은 매우 간단 합 니 다.그러나 우 리 는 평소에 linq 를 사용 할 때 반드시 생각 하지 못 합 니 다.
    여기 서 몇 가지 질문 을 하 겠 습 니 다.
    이 코드 에서 모두 몇 차례 조 회 를 진행 하 였 습 니까?
    코드 에서 사용 하 는 것 은 어떤 페이지 기술 입 니까?(진짜 페이지?가짜 페이지?)
    5.X.PagedList 를 사용 하여 전단 페이지 나 누 기
    Asp.Net Mvc 에서 전단 페이지 를 나 누 면 일련의 오픈 소스 가 실 현 됩 니 다.제 Demo 에서 사용 하 는 것 은 오픈 소스 의 X.PagedList 페이지 입 니 다.구체 적 인 소스 코드 를 알 고 싶 으 시 면 X.PagedList GitHub 를 참고 하 세 요.
    1.웹 프로젝트 에 X.PagedList.Mvc Nuget 패 키 지 를 자체 적 으로 설치 하 십시오.

    X.PagedList.Mvc Nuget 패키지
    2.Controller 에서 X.PagedList 가 제공 하 는 방법 으로 페이지 구성 결 과 를 전단 에서 사용 합 니 다.
    응용 서비스 층 에서 페이지 논 리 를 수 동 으로 실 현 했 기 때문에 X.PagedList 홈 페이지 의 예제 에 따라 저 희 는 자체 적 으로 Static PagedList 를 구성 하여 결 과 를 되 돌려 야 합 니 다.
    
     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">
       <div class="btn-group pull-right">
        <button type="button" class="btn btn-info">Edit</button>
        <button type="button" class="btn btn-success">Delete</button>
       </div>
       <div class="media">
        <a class="media-left" href="#" rel="external nofollow" >
         @*<i class="fa @Model.GetTaskLable(task) fa-3x"></i>*@
        </a>
        <div class="media-body">
         <h4 class="media-heading">@task.Title</h4>
         <span class="text-muted">@task.CreationTime.ToString("yyyy-MM-dd HH:mm:ss")</span>
        </div>
       </div>
      </li>
     }
    </ul>
    @Html.PagedListPager((IPagedList)ViewBag.OnePageOfTasks, page => Url.Action("PagedList", new { page }))
    그 중 마지막 코드 는 페이지 컨트롤 을 만 드 는 데 쓰 인 다.
    최종 효 과 는 그림:
    총화
    총결산
    이 절 은 주로 ABP 를 사용 하여 백 스테이지 페이지 를 나 누 는 방법 을 설명 하고 ABP 백 스테이지 페이지 논리의 실현 방식 을 설명 한다.X.PagedList 를 사용 하여 전단 페이지 를 나 누 는 방법 도 보 여 주 었 다.

    좋은 웹페이지 즐겨찾기