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();
}
}
'개발 > .NET' 카테고리의 다른 글
정규식 기본 (2) | 2010.03.06 |
---|---|
asp.net mvc admin 섹션 구성방법 (2) | 2010.02.22 |
asp.net mvc 및 기타 web 참조 기술 블로그 (0) | 2010.02.17 |
개발 참고 블로그 (0) | 2010.02.09 |
asp.net mvc 샘플 소스 (0) | 2010.02.09 |