[Blazor] 동적 페이지 개수 구하기

개요

  • Blazor 에서 동적으로 페이지 개수(PageCount) 구하는 방법에 대해서 정리 진행합니다.

시나리오

  • 현재 데이터베이스에서 Candidates 테이블에 총 9개의 Record 가 저장되어 있다고 가정합니다.
  • 여기서 저는 한 페이지당, 3개의 데이터(PageSize = 3)를 보여준다고 하면 PageCount 는 3개의 데이터씩 총 9개의 Record 가 기록되어 있으니 PageCount 는 3이 됩니다.
  • 여기서 만약, 소수로 떨어진다면 소수 값 그 이상의 값으로 무조건 반올림을 해 주어야지 정수 값으로 표현이 가능합니다.
  • 위 시나리오 대로 동적으로 페이지 개수를 구하는 방법에 대한 로직을 작성 진행합니다.

동적 페이지 개수 구하는 로직

  • 동적으로 페이지를 구하기 위한 C# 로직은 다음과 같습니다.
@code {
    // 현재 페이지(컴포넌트) 에서 사용할 모델 또는 컬렉션
    private Candidate[]? Candidates { get; set; }

    /// <summary>
    /// 페이지 사이즈 : 한 페이지에 몇 개의 레코드를 보여줄건지 결정
    /// </summary>
    public int PageSize { get; set; } = 3;

    /// <summary>
    /// 페이지 번호 : 현재 보여줄 페이지 번호: 1 페이지, 2 페이지 ..
    /// </summary>
    [Parameter]
    public int? Page{ get; set; } // PageNumber

    /// <summary>
    /// 페이지 인덱스 : 현재 보여줄 페이지 번호의 인덱스(PageNumber - 1)
    /// </summary>
    public int PageIndex { get; set; }

    /// <summary>
    /// 총 몇 개의 페이지가 만들어지는지 : Math.Ceiling(총 레코드 수 / 10 (한 페이지에서 보여줄))
    /// </summary>
    public int PageCount { get; set; }

    /// <summary>
    /// 레코드 카운트 : 현재 테이블에 몇 개의 레코드가 있는지 지정
    /// </summary>
    public int RecordCount { get; set; }

    protected override async Task OnParametersSetAsync()
    {
        if (Page is null or < 1)
        {
            // 1 페이지로 URL
            string url = "/Candidates/1";
            NavigationManagerInjector.NavigateTo(url);
            return;
        }

        PageIndex = Page.Value - 1;

        using var context = _ContextFactory.CreateDbContext();

        RecordCount = await context.Candidates.CountAsync();
        PageCount = Convert.ToInt32(Math.Ceiling(RecordCount / (double)PageSize));

        if(PageCount == 0)
        {
            PageCount = 1; // 데이터가 없으면 1 페이지로 초기화
        }

        if (Page > PageCount)
        {
            NavigationManagerInjector.NavigateTo($"/Candidates/{PageCount}");
            return;
        }

        Candidates = await context.Candidates
            .OrderBy(it => it.FirstName)
            .Skip(PageIndex * PageSize) // Page Skip 지정
            .Take(PageSize)
            .ToArrayAsync();
    }
}
  • 쉽게 설명하여, 데이터베이스에서 저장되어 있는 전체 Record 수를 CountAsync 메서드를 통해 조회 하여 RecordCount 속성에 저장합니다.
  • 그리고 RecordCount 값을 PageSize 로 나눕니다. 여기서 PageSize 는 본인이 한 페이지당 보여주고자 하는 Record 개수를 의미합니다.
  • 보다 정교하게 값을 다루기 위해서, double 형 타입과 Math.Ceiling 함수를 사용하였습니다.
  • 위와 같이 동적으로 본인이 보여주고자 하는 페이지 개수를 구할 수 있습니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY