첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestProject.zip
다운로드

▶ TagHelpers/PagingHelperTagHelper.cs

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

namespace TestProject.TagHelpers
{
    /// <summary>
    /// 페이징 헬퍼
    /// </summary>
    public class PagingHelperTagHelper : TagHelper
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 레코드 수
        /// </summary>
        private int recordCount;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 검색 모드 - SearchMode

        /// <summary>
        /// 검색 모드
        /// </summary>
        public bool SearchMode { get; set; } = false;

        #endregion
        #region 검색 필드 - SearchField

        /// <summary>
        /// 검색 필드
        /// </summary>
        public string SearchField { get; set; }

        #endregion
        #region 검색 쿼리 - SearchQuery

        /// <summary>
        /// 검색 쿼리
        /// </summary>
        public string SearchQuery { get; set; }

        #endregion
        #region 페이지 인덱스 - PageIndex

        /// <summary>
        /// 페이지 인덱스
        /// </summary>
        /// <remarks>0부터 시작한다.</remarks>
        public int PageIndex { get; set; } = 0;

        #endregion
        #region 페이지 수 - PageCount

        /// <summary>
        /// 페이지 수
        /// </summary>
        public int PageCount { get; set; }

        #endregion
        #region 페이지 크기 - PageSize

        /// <summary>
        /// 페이지 크기
        /// </summary>
        public int PageSize { get; set; } = 10;

        #endregion
        #region URL - URL

        /// <summary>
        /// URL
        /// </summary>
        public string URL { get; set; }

        #endregion
        #region 레코드 수 - RecordCount

        /// <summary>
        /// 레코드 수
        /// </summary>
        public int RecordCount
        {
            get
            {
                return this.recordCount;
            }
            set
            {
                this.recordCount = value;

                PageCount = ((this.recordCount - 1) / PageSize) + 1;
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 처리하기 - Process(context, output)

        /// <summary>
        /// 처리하기
        /// </summary>
        /// <param name="context">컨텍스트</param>
        /// <param name="output">출력</param>
        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;

            StringBuilder stringBuilder = new StringBuilder();

            if(PageIndex > 10)
            {
                if(!SearchMode)
                {
                    stringBuilder.Append("<li><a href=\"");
                    stringBuilder.Append(URL);
                    stringBuilder.Append("?Page=");
                    stringBuilder.Append(Convert.ToString(((PageIndex - 1) / (int)10) * 10));
                    stringBuilder.Append("\">◀ </a></li>");
                }
                else
                {
                    stringBuilder.Append("<li><a href=\"");
                    stringBuilder.Append(URL);
                    stringBuilder.Append("?Page=");
                    stringBuilder.Append(Convert.ToString(((PageIndex - 1) / (int)10) * 10));
                    stringBuilder.Append("&SearchField=");
                    stringBuilder.Append(SearchField);
                    stringBuilder.Append("&SearchQuery=");
                    stringBuilder.Append(SearchQuery);
                    stringBuilder.Append("\">◀ </a></li>");
                }
            }
            else
            {
                stringBuilder.Append("<li class='disabled'><a>◁ </a></li>");
            }

            int startPage = ((PageIndex - 1) / (int)10) * 10 + 1;
            int endPage   = (((PageIndex - 1) / (int)10) + 1) * 10;

            for(i = startPage; i <= endPage; i++)
            {
                if(i > PageCount)
                {
                    break;
                }

                if(i == PageIndex)
                {
                    stringBuilder.Append("<li class='active'><a href='#'><b>");
                    stringBuilder.Append(i.ToString());
                    stringBuilder.Append("</b></a></li>");
                }
                else
                {
                    if(!SearchMode)
                    {
                        stringBuilder.Append("<li><a href=\"");
                        stringBuilder.Append(URL);
                        stringBuilder.Append("?Page=");
                        stringBuilder.Append(i.ToString());
                        stringBuilder.Append("\">");
                        stringBuilder.Append(i.ToString());
                        stringBuilder.Append("</a></li>");
                    }
                    else
                    {
                        stringBuilder.Append("<li><a href=\"");
                        stringBuilder.Append(URL);
                        stringBuilder.Append("?Page=");
                        stringBuilder.Append(i.ToString());
                        stringBuilder.Append("&SearchField=");
                        stringBuilder.Append(SearchField);
                        stringBuilder.Append("&SearchQuery=");
                        stringBuilder.Append(SearchQuery);
                        stringBuilder.Append("\">");
                        stringBuilder.Append(i.ToString());
                        stringBuilder.Append("</a></li>");
                    }
                }

                if(i < endPage)
                {
                    stringBuilder.Append("&nbsp;");
                }
            }

            if(i < PageCount)
            {
                if(!SearchMode)
                {
                    stringBuilder.Append("<li><a href=\"");
                    stringBuilder.Append(URL);
                    stringBuilder.Append("?Page=");
                    stringBuilder.Append(Convert.ToString(((PageIndex - 1) / (int)10) * 10 + 11));
                    stringBuilder.Append("\"> ▶</a></li>");
                }
                else
                {
                    stringBuilder.Append("<li><a href=\"");
                    stringBuilder.Append(URL);
                    stringBuilder.Append("?Page=");
                    stringBuilder.Append(Convert.ToString(((PageIndex - 1) / (int)10) * 10 + 11));
                    stringBuilder.Append("&SearchField=");
                    stringBuilder.Append(SearchField);
                    stringBuilder.Append("&SearchQuery=");
                    stringBuilder.Append(SearchQuery);
                    stringBuilder.Append("\"> ▶</a></li>");
                }
            }
            else
            {
                stringBuilder.Append("<li class='disabled'><a> ▷</a></li>");
            }

            output.Content.AppendHtml(stringBuilder.ToString());
        }

        #endregion
    }
}

 

▶ Views/Test/Index.cshtml

@addTagHelper *, TestProject
<p>TagHelper 클래스 : 게시판 페이지 번호 목록을 생성하는 사용자 정의 태그 헬퍼 만들기</p>
<hr />
<paging-helper url="@Context.Request.Path"
    page-index='Convert.ToInt32(Context.Request.Query["Page"])'
    page-size="10"
    record-count="301"
    search-mode="false">
</paging-helper>
<paging-helper url="@Context.Request.Path"
    page-index='Convert.ToInt32(Context.Request.Query["Page"])'
    page-size="10"
    record-count="100"
    search-mode="true"
    search-field="Name"
    search-query="홍길동">
</paging-helper>
728x90
반응형
그리드형

'.NetCore > ASP.NET MVC' 카테고리의 다른 글

[.NETCORE/ASP.NET MVC] JsonConfigurationExtensions 클래스 : AddJsonFile 확장 메소드를 사용해 환경 설정 파일 로드하기  (0) 2020.10.08
[.NETCORE/ASP.NET MVC] LoggerExtensions 클래스 : LogInformation 확장 메소드를 사용해 로그 기록하기  (0) 2020.10.08
[.NETCORE/ASP.NET MVC] 파일 업로드/다운로드하기  (0) 2020.10.08
[.NETCORE/ASP.NET MVC] ServiceCollectionServiceExtensions 클래스 : AddSingleton 확장 메소드를 사용해 싱글톤 객체 의존성 주입 사용하기  (0) 2020.10.08
[.NETCORE/ASP.NET MVC] <cache> 태그 : 캐시 기능 사용하기  (0) 2020.10.07
[.NETCORE/ASP.NET MVC] TagHelper 클래스 : 게시판 페이지 번호 목록을 생성하는 사용자 정의 태그 헬퍼 만들기  (0) 2020.10.07
[.NETCORE/ASP.NET MVC] TagHelper 클래스 : 유닉스 시간을 현재 시간으로 변환하는 사용자 정의 태그 헬퍼 만들기  (0) 2020.10.07
[.NETCORE/ASP.NET MVC] TagHelper 클래스 : 메일 주소 링크를 생성하는 사용자 정의 태그 헬퍼 만들기  (0) 2020.10.07
[.NETCORE/ASP.NET MVC] TagHelper 클래스 : <b><u> 태그로 둘러싸는 문자열을 생성하는 사용자 정의 태그 헬퍼 만들기  (0) 2020.10.07
[.NETCORE/ASP.NET MVC] @tagHelperPrefix 지시문 : 내장 태그 헬퍼에 접두사 붙이기  (0) 2020.10.07
[.NETCORE/ASP.NET MVC] asp-controller/asp-actio 태그 헬퍼를 사용해 링크 만들기  (0) 2020.10.07
Posted by 사용자 icodebroker

댓글을 달아 주세요