asp.net mvc 확장메서드와 람다식을 이용한 페이징 메서드
html.Action() 의 엔트리에 맞는 url를 반환한다.
대리자에게 페이지번호를 넘겨 위의 url를 받아 html 코드로 포장하여 반환한다.
* 사용법
<%= Html.PageLink([현재 페이지 번호], [총 페이지 사이즈],
x => Url.Action(["액션"], new { page = x })
) %>
람다식 Url.Action() 의 두번째 인자는 익명의 타입으로 page 라는 변수를 전달하는데
이것은 Url.Action() 가 route에 등록된 엔트리 규칙에 부합되는 url를 생성하여 반환한다.
* 아래는 구현 코드
public static class ExtensionHelper
{
public static string PageLink(this HtmlHelper source,
int curPage, int totalPages, Func<int, string> pageUrl)
{
const int pageLimit = 10;
int startPage = ((curPage - 1) / pageLimit) * pageLimit + 1;
int endPage = startPage + pageLimit - 1;
if (totalPages < endPage) endPage = totalPages;
int nextPage = endPage + 1;
StringBuilder pageBuilder = new StringBuilder();
if (curPage > 1)
{
TagBuilder first = new TagBuilder("a");
first.MergeAttribute("href", pageUrl(1));
first.InnerHtml = "처음";
pageBuilder.AppendLine(first.ToString());
}
if (curPage > pageLimit)
{
TagBuilder prevTag = new TagBuilder("a");
prevTag.MergeAttribute("href", pageUrl(startPage - 1));
prevTag.InnerHtml = "이전";
pageBuilder.AppendLine(prevTag.ToString());
}
for (int i = startPage; i <= endPage; i++)
{
TagBuilder tag = new TagBuilder("a");
tag.MergeAttribute("href", pageUrl(i));
tag.InnerHtml = i.ToString();
if (i == curPage)
tag.AddCssClass("selected");
pageBuilder.AppendLine(tag.ToString());
}
if (nextPage <= totalPages)
{
TagBuilder nextTag = new TagBuilder("a");
nextTag.MergeAttribute("href", pageUrl(nextPage));
nextTag.InnerHtml = "다음";
pageBuilder.AppendLine(nextTag.ToString());
}
if (curPage < totalPages)
{
TagBuilder lastTag = new TagBuilder("a");
lastTag.MergeAttribute("href", pageUrl(totalPages));
lastTag.InnerHtml = "마지막";
pageBuilder.AppendLine(lastTag.ToString());
}
return pageBuilder.ToString();
}
}