ABP 입문 시리즈 의 페이지 기능 실현
우선 ABP 가 페이지 를 봉인 해 주 셔 서 다행 입 니 다.정말 마음 에 듭 니 다.
자,자,이 절 에서 ABP 를 어떻게 사용 하 는 지 페이지 를 훑 어 보 자.
1.페이지 별 DTO 정의 요청
데이터 전송 대상(Data Transfer Objects)은 응용 층 과 표현 층 의 데이터 전송 에 사용 된다.
표현 층 전송 데이터 전송 대상(DTO)은 응용 서비스 방법 을 호출 한 다음 에 응용 서 비 스 는 분야 대상 을 통 해 특정한 업무 논 리 를 집행 하고 DTO 로 표현 층 에 되 돌려 준다.이렇게 표현 층 과 영역 층 이 완전히 분리 되 었 다.양호 한 층 을 가 진 응용 프로그램 에서 표현 층 은 영역 대상(창고,실체)을 직접 사용 하지 않 는 다.
우 리 는 표현 층 에 페이지 요청 이 있 을 때 보통 두 개의 인 자 를 지정 해 야 합 니 다.하 나 는 몇 페이지 를 표시 하고 하 나 는 각 페이지 의 줄 수(일반적으로 프로필 설정 이 있 습 니 다)입 니 다.
페이지 를 나 누 는 것 은 매우 자주 사용 하 는 기능 이기 때문에 표현 층 이 우리 가 페이지 를 나 누 어 요청 할 때 해당 하 는 DTO 가 이 두 인 자 를 밀봉 하 는 것 이 좋 습 니 다.
ABP 소스 코드 에 서 는 이러한 공용 클래스 를 봉인 하지 않 았 으 나,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 List
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 에서 사용 하지 않 은 두 가지 방법
WhereIf
과PageBy
을 발 견 했 을 지도 모 릅 니 다.예,이것 은 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 를 사용 하여 전단 페이지 를 나 누 는 방법 도 보 여 주 었 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ABP 입문 시리즈 의 페이지 기능 실현우 리 는 표현 층 에 페이지 요청 이 있 을 때 보통 두 개의 인 자 를 지정 해 야 합 니 다.하 나 는 몇 페이지 를 표시 하고 하 나 는 각 페이지 의 줄 수(일반적으로 프로필 설정 이 있 습 니 다)입 니 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.