더북(TheBook)

37.5.7 따라하기 6: 이미 구현 완료된 페이징 처리를 위한 태그 헬퍼 확인

1. DotNetNote 프로젝트의 TagHelpers 폴더에는 이미 DnnPaginHelperTaghelper.cs 파일이 있다. 이는 게시판의 리스트 페이지에서 사용할 페이징 처리 컨트롤을 의미한다. 웹 폼 방식에서 따로 페이저를 구현했던 AdvancedPagingSingleWithBootstrap.ascx 파일과 같은 기능을 ASP.NET Core 1.0의 태그 헬퍼로 표현한 것이다. 이전 10개 및 다음 10개에 대한 페이징 처리를 위한 코드는 HTML 영역에서 직접 작업해도 되지만, 이처럼 태그 헬퍼로 따로 구현하고 이를 포함시켜서 사용하는 것도 또 하나의 방법이다. 만약 새롭게 프로젝트를 생성 후 게시판 프로젝트를 진행한다면 다음 코드가 구현되어 있어야 한다.

▼  /TagHelpers/DnnPagingHelperTagHelper.cs

using Microsoft.AspNetCore.Razor.TagHelpers;
using System;

namespace DotNetNote.TagHelpers
{
  /// <summary>
  /// 페이징 헬퍼(dnn-paging-helper)
  /// </summary>
  public class DnnPagingHelperTagHelper : TagHelper
  {
      /// <summary>
      /// 기본 리스트면 false, 검색 결과에 대한 페이징 리스트면 true
      /// </summary>
      public bool SearchMode { get; set; } = false;
      /// <summary>
      /// 검색할 필드: Name, Title, Content
      /// </summary>
      public string SearchField { get; set; }
      /// <summary>
      /// 검색할 내용
      /// </summary>
      public string SearchQuery { get; set; }
      
      /// <summary>
      /// 현재 보여줄 페이지 인덱스: 0, 1, 2
      /// </summary>
      public int PageIndex { get; set; } = 0;
      /// <summary>
      /// 총 페이지 개수
      /// </summary>
      public int PageCount { get; set; }
      /// <summary>
      /// 한 페이지에 보여줄 아티클 개수
      /// </summary>
      public int PageSize { get; set; } = 10;
      
      /// <summary>
      /// 페이징 헬퍼가 실행될 URL
      /// </summary>
      public string Url { get; set; }
      
      private int _RecordCount;
      /// <summary>
      /// 총 레코드 수
      /// </summary>
      public int RecordCount
      {
          get { return _RecordCount; }
          set
          {
              _RecordCount = value;
              PageCount = ((_RecordCount - 1) / PageSize) + 1; // 계산식
          }
      }
      
      public override void Process(
          TagHelperContext context, TagHelperOutput output)
      {
          output.TagName = “ul”;
          output.Attributes.Add(“class”, “pagination pagination-sm”);
          
          if (PageIndex == 0)
          {
              PageIndex = 1;
          }
          
          int i = 0;
          
          string strPage = ””;
          
          
          if (PageIndex > 10)
          {
              if (!SearchMode)
              {
                  strPage += “<li><a href=\“” + Url + ”?Page=”
                      + Convert.ToString(((PageIndex - 1) / (int)10)  10)
                      + “\”>◀</a></li>“;
              }
              else
              {
                  strPage += “<li><a href=\“” + Url + ”?Page=”
                      + Convert.ToString(((PageIndex - 1) / (int)10)  10)
                      + “&SearchField=” + SearchField
                      + “&SearchQuery=” + SearchQuery + “\”>◀</a></li>“;
              }
          }
          else
          {
              strPage += “<li class=‘disabled’><a>◁</a></li>“;
          }
          
          for (i = (((PageIndex - 1) / (int)10)  10 + 1);
              i <= ((((PageIndex - 1) / (int)10) + 1)  10); i++)
          {
              if (i > PageCount)
              {
                  break;
              }
              if (i == PageIndex)
              {
                  strPage += ” <li class=‘active’><a href=‘#’>“
                      + i.ToString() + “</a></li>“;
              }
              else
              {
                  if (!SearchMode)
                  {
                      strPage += “<li><a href=\“” + Url + ”?Page=”
                          + i.ToString() + “\”>“ + i.ToString() + “</a></li>“;
                  }
                  else
                  {
                      strPage += “<li><a href=\“” + Url + ”?Page=”
                          + i.ToString() + “&SearchField=” + SearchField
                          + “&SearchQuery=” + SearchQuery + “\”>“
                          + i.ToString() + “</a></li>“;
                  }
              }
          }
          
          if (i < PageCount)
          {
              if (!SearchMode)
              {
                  strPage += “<li><a href=\“” + Url + ”?Page=”
                      + Convert.ToString(((PageIndex - 1) / (int)10)  10 + 11)
                      + “\”>▶</a></li>“;
              }
              else
              {
                  strPage += “<li><a href=\“” + Url + ”?Page=”
                      + Convert.ToString(((PageIndex - 1) / (int)10)  10 + 11)
                      + “&SearchField=” + SearchField
                      + “&SearchQuery=” + SearchQuery + “\”>▶</a></li>“;
              }
          }
          else
          {
              strPage += “<li class=‘disabled’><a>▷</a></li>“;
          }
          
          output.Content.AppendHtml(strPage);
      }
  }
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.