mvc 分页控件(from All-In-One Code Framework )
先上代码吧,看看我们能从代码中学到什么。
代码
namespace CSASPNETMVCPager.Helper
{
public class Pager<T>
{
/// <summary>
/// determine how many records displayed in one page
/// </summary>
public int pageSize = 6;
/// <summary>
/// instantiate a pager object
/// </summary>
/// <param name="collection">datasource which implement ICollection<T></param>
/// <param name="currentPageIndex">Current page index</param>
/// <param name="requestBaseUrl">Request base url</param>
public Pager(ICollection<T> collection,int currentPageIndex,string requestBaseUrl)
{
int count = collection.Count;
int remainder = count % pageSize;
int quotient = count / pageSize;
this.CurrentPageIndex = currentPageIndex;
this.TotalPages = remainder == 0 ? quotient : quotient + 1;
this.RequestBaseUrl = requestBaseUrl;
}
/// <summary>
/// instantiate a pager object
/// </summary>
/// <param name="collection">datasource which implement ICollection<T></param>
/// <param name="currentPageIndex">Current page index</param>
/// <param name="requestBaseUrl">Request base url</param>
/// <param name="imgUrlForUp">image for previous page</param>
/// <param name="imgUrlForDown">image for next page</param>
public Pager(ICollection<T> collection, int currentPageIndex, string requestBaseUrl, string imgUrlForUp, string imgUrlForDown)
{
int count = collection.Count;
int remainder = count % pageSize;
int quotient = count / pageSize;
this.CurrentPageIndex = currentPageIndex;
this.TotalPages = remainder == 0 ? quotient : quotient + 1;
this.RequestBaseUrl = requestBaseUrl;
this.ImageUrlForDown = imgUrlForDown;
this.ImageUrlForUp = imgUrlForUp;
}
/// <summary>
/// instantiate a pager object
/// </summary>
/// <param name="collection">datasource which implement ICollection<T></param>
/// <param name="currentPageIndex">Current page index</param>
/// <param name="requestBaseUrl">Request base url</param>
/// <param name="imgUrlForUp">image for previous page</param>
/// <param name="imgUrlForDown">image for next page</param>
/// <param name="pagesSize">determine the size of page numbers displayed</param>
public Pager(IList<T> collection, int currentPageIndex, string requestBaseUrl, string imgUrlForUp, string imgUrlForDown, int pagesSize)
{
int count = collection.Count;
int remainder = count % pageSize;
int quotient = count / pageSize;
this.CurrentPageIndex = currentPageIndex;
this.TotalPages = remainder == 0 ? quotient : quotient + 1;
this.RequestBaseUrl = requestBaseUrl;
this.ImageUrlForDown = imgUrlForDown;
this.ImageUrlForUp = imgUrlForUp;
this.PagesSize = this.PagesSize > pagesSize ? this.PagesSize : pagesSize;
}
/// <summary>
/// current page index
/// </summary>
public int CurrentPageIndex { get; private set; }
/// <summary>
/// total pages
/// </summary>
public int TotalPages { get; private set; }
/// <summary>
/// base url and id value construct a whole url, eg:http://RequestBaseUrl/id
/// </summary>
public string RequestBaseUrl { get; private set; }
/// <summary>
/// image for previous page
/// </summary>
public string ImageUrlForUp { get; private set; }
/// <summary>
/// image for next page
/// </summary>
public string ImageUrlForDown { get; private set; }
/// <summary>
/// size of page numbers which are displayed
/// </summary>
public int PagesSize { get; private set; }
}
/// <summary>
/// Customize pager engineer
/// </summary>
public static class CustomizePager
{
/// <summary>
/// Simply input 'Up' or 'Down' for paging
/// </summary>
/// <param name="currentPageIndex">current page index</param>
/// <param name="totalPages">total pages</param>
/// <param name="requestBaseUrl">base url and id value construct a whole url, eg:http://baseURL/id</param>
public static string CreatePager(int currentPageIndex, int totalPages, string requestBaseUrl)
{
Validate(currentPageIndex, totalPages);
StringBuilder sb = new StringBuilder();
if (currentPageIndex > 0)
{
sb.Append(string.Format("<a href=\"{0}\">Up</a>", requestBaseUrl + "/" + (currentPageIndex - 1).ToString()));
}
if (currentPageIndex != totalPages - 1)
{
sb.Append(string.Format("<a href=\"{0}\">Down</a>", requestBaseUrl + "/" + (currentPageIndex + 1).ToString()));
}
return sb.ToString();
}
/// <summary>
/// Use the passed images for paging
/// </summary>
/// <param name="currentPageIndex">current page index</param>
/// <param name="totalPages">total pages</param>
/// <param name="requestBaseUrl">base url and id value construct a whole url, eg:http://baseURL/id</param>
/// <param name="imageUrlForUp">image for previous page</param>
/// <param name="imageUrlForDown">image for next page</param>
/// <returns></returns>
public static string CreatePager(int currentPageIndex, int totalPages, string requestBaseUrl, string imageUrlForUp, string imageUrlForDown)
{
Validate(currentPageIndex, totalPages);
StringBuilder sb = new StringBuilder();
if (currentPageIndex > 0)
{
sb.Append(string.Format("<a href=\"{0}\"><img src={1} style=\"boder:0px;border-color: #FFFFFF\"/></a>", requestBaseUrl + "/" + (currentPageIndex - 1).ToString(), imageUrlForUp));
}
if (currentPageIndex != totalPages - 1)
{
sb.Append(string.Format("<a href=\"{0}\"><img src={1} style=\"boder:0px;border-color: #FFFFFF\"/></a>", requestBaseUrl + "/" + (currentPageIndex + 1).ToString(), imageUrlForDown));
}
return sb.ToString();
}
/// <summary>
/// Use arabic numerals and images for paging
/// </summary>
/// <param name="currentPageIndex">current page index</param>
/// <param name="totalPages">total pages</param>
/// <param name="requestBaseUrl">base url and id value construct a whole url, eg:http://baseURL/id</param>
/// <param name="pagesSize">size of page numbers which are displayed </param>
/// <param name="imageUrlForUp">image for previous page</param>
/// <param name="imageUrlForDown">image for next page</param>
/// <returns></returns>
public static string CreatePager(int currentPageIndex, int totalPages, string requestBaseUrl, int pagesSize, string imageUrlForUp, string imageUrlForDown)
{
StringBuilder sb = new StringBuilder();
Validate(currentPageIndex, totalPages, pagesSize);
string href = "javascript:void(0)";
//determine whether there is previous page
if (currentPageIndex / pagesSize != 0)
{
href = string.Format(requestBaseUrl + "/" + ((currentPageIndex / pagesSize) * pagesSize - 1).ToString());
}
sb.Append(string.Format("<a href=\"{0}\"><img src=\"{1}\" style=\"boder:0px;border-color: #FFFFFF\"/></a>", href, imageUrlForUp));
sb.Append(" ");
//the max size of page numbers which are displayed
int pageIndexMaxIncrement = (currentPageIndex / pagesSize + 1) * pagesSize > totalPages ? totalPages - pagesSize * (currentPageIndex / pagesSize) : pagesSize;
//inital page number
int pageIndex = pagesSize * (int)(currentPageIndex / pagesSize);
for (int i = 0; i < pageIndexMaxIncrement; i++)
{
if (pageIndex == currentPageIndex)
{
sb.Append(string.Format("<a href='{0}' style='{2}'>{1}</a>", "javascript:void(0)", (pageIndex + 1).ToString(), "text-decoration:none;"));
}
else
{
sb.Append(string.Format("<a href='{0}'>{1}</a>", requestBaseUrl + "/" + pageIndex.ToString(), (pageIndex + 1).ToString()));
}
sb.Append(" ");
pageIndex++;
}
href = "javascript:void(0)";
//determine whether there is next page
if (pageIndex < totalPages - 1)
{
href = string.Format(requestBaseUrl + "/" +pageIndex.ToString());// ((currentPageIndex / pagesSize + 1) * pagesSize - 1).ToString());
}
sb.Append(string.Format("<a href=\"{0}\"><img src=\"{1}\" style=\"boder:0px;border-color: #FFFFFF\"/></a>", href, imageUrlForDown));
return sb.ToString();
}
/// <summary>
/// customize html helper method
/// </summary>
/// <param name="htmlHelper">HtmlHelper</param>
/// <param name="pager">Pager</param>
/// <returns></returns>
public static string CreatePager<T>(this HtmlHelper htmlHelper, Pager<T> pager)
{
if (string.IsNullOrEmpty(pager.ImageUrlForDown.ToString()) || string.IsNullOrEmpty(pager.ImageUrlForUp.ToString()))
{
return CreatePager(pager.CurrentPageIndex, pager.TotalPages, pager.RequestBaseUrl);
}
else if (pager.PagesSize <= 1)
{
return CreatePager(pager.CurrentPageIndex, pager.TotalPages, pager.RequestBaseUrl, pager.ImageUrlForUp.ToString(), pager.ImageUrlForDown.ToString());
}
else
{
return CreatePager(pager.CurrentPageIndex, pager.TotalPages, pager.RequestBaseUrl, pager.PagesSize, pager.ImageUrlForUp.ToString(), pager.ImageUrlForDown.ToString());
}
}
private static void Validate(int currentPageIndex, int totalPages)
{
if (currentPageIndex < 0)
{
throw new Exception("The current page indx must not be less than zero");
}
if (totalPages < 1)
{
throw new Exception("The total pages must not be less than 1");
}
if (currentPageIndex > totalPages - 1)
{
throw new Exception("The current page index can't be greater than total pages");
}
}
private static void Validate(int currentPageIndex, int totalPages, int pagesSize)
{
Validate(currentPageIndex, totalPages);
if (pagesSize < 0)
{
throw new Exception("The page size must be greater thatn zero");
}
}
}
}
{
public class Pager<T>
{
/// <summary>
/// determine how many records displayed in one page
/// </summary>
public int pageSize = 6;
/// <summary>
/// instantiate a pager object
/// </summary>
/// <param name="collection">datasource which implement ICollection<T></param>
/// <param name="currentPageIndex">Current page index</param>
/// <param name="requestBaseUrl">Request base url</param>
public Pager(ICollection<T> collection,int currentPageIndex,string requestBaseUrl)
{
int count = collection.Count;
int remainder = count % pageSize;
int quotient = count / pageSize;
this.CurrentPageIndex = currentPageIndex;
this.TotalPages = remainder == 0 ? quotient : quotient + 1;
this.RequestBaseUrl = requestBaseUrl;
}
/// <summary>
/// instantiate a pager object
/// </summary>
/// <param name="collection">datasource which implement ICollection<T></param>
/// <param name="currentPageIndex">Current page index</param>
/// <param name="requestBaseUrl">Request base url</param>
/// <param name="imgUrlForUp">image for previous page</param>
/// <param name="imgUrlForDown">image for next page</param>
public Pager(ICollection<T> collection, int currentPageIndex, string requestBaseUrl, string imgUrlForUp, string imgUrlForDown)
{
int count = collection.Count;
int remainder = count % pageSize;
int quotient = count / pageSize;
this.CurrentPageIndex = currentPageIndex;
this.TotalPages = remainder == 0 ? quotient : quotient + 1;
this.RequestBaseUrl = requestBaseUrl;
this.ImageUrlForDown = imgUrlForDown;
this.ImageUrlForUp = imgUrlForUp;
}
/// <summary>
/// instantiate a pager object
/// </summary>
/// <param name="collection">datasource which implement ICollection<T></param>
/// <param name="currentPageIndex">Current page index</param>
/// <param name="requestBaseUrl">Request base url</param>
/// <param name="imgUrlForUp">image for previous page</param>
/// <param name="imgUrlForDown">image for next page</param>
/// <param name="pagesSize">determine the size of page numbers displayed</param>
public Pager(IList<T> collection, int currentPageIndex, string requestBaseUrl, string imgUrlForUp, string imgUrlForDown, int pagesSize)
{
int count = collection.Count;
int remainder = count % pageSize;
int quotient = count / pageSize;
this.CurrentPageIndex = currentPageIndex;
this.TotalPages = remainder == 0 ? quotient : quotient + 1;
this.RequestBaseUrl = requestBaseUrl;
this.ImageUrlForDown = imgUrlForDown;
this.ImageUrlForUp = imgUrlForUp;
this.PagesSize = this.PagesSize > pagesSize ? this.PagesSize : pagesSize;
}
/// <summary>
/// current page index
/// </summary>
public int CurrentPageIndex { get; private set; }
/// <summary>
/// total pages
/// </summary>
public int TotalPages { get; private set; }
/// <summary>
/// base url and id value construct a whole url, eg:http://RequestBaseUrl/id
/// </summary>
public string RequestBaseUrl { get; private set; }
/// <summary>
/// image for previous page
/// </summary>
public string ImageUrlForUp { get; private set; }
/// <summary>
/// image for next page
/// </summary>
public string ImageUrlForDown { get; private set; }
/// <summary>
/// size of page numbers which are displayed
/// </summary>
public int PagesSize { get; private set; }
}
/// <summary>
/// Customize pager engineer
/// </summary>
public static class CustomizePager
{
/// <summary>
/// Simply input 'Up' or 'Down' for paging
/// </summary>
/// <param name="currentPageIndex">current page index</param>
/// <param name="totalPages">total pages</param>
/// <param name="requestBaseUrl">base url and id value construct a whole url, eg:http://baseURL/id</param>
public static string CreatePager(int currentPageIndex, int totalPages, string requestBaseUrl)
{
Validate(currentPageIndex, totalPages);
StringBuilder sb = new StringBuilder();
if (currentPageIndex > 0)
{
sb.Append(string.Format("<a href=\"{0}\">Up</a>", requestBaseUrl + "/" + (currentPageIndex - 1).ToString()));
}
if (currentPageIndex != totalPages - 1)
{
sb.Append(string.Format("<a href=\"{0}\">Down</a>", requestBaseUrl + "/" + (currentPageIndex + 1).ToString()));
}
return sb.ToString();
}
/// <summary>
/// Use the passed images for paging
/// </summary>
/// <param name="currentPageIndex">current page index</param>
/// <param name="totalPages">total pages</param>
/// <param name="requestBaseUrl">base url and id value construct a whole url, eg:http://baseURL/id</param>
/// <param name="imageUrlForUp">image for previous page</param>
/// <param name="imageUrlForDown">image for next page</param>
/// <returns></returns>
public static string CreatePager(int currentPageIndex, int totalPages, string requestBaseUrl, string imageUrlForUp, string imageUrlForDown)
{
Validate(currentPageIndex, totalPages);
StringBuilder sb = new StringBuilder();
if (currentPageIndex > 0)
{
sb.Append(string.Format("<a href=\"{0}\"><img src={1} style=\"boder:0px;border-color: #FFFFFF\"/></a>", requestBaseUrl + "/" + (currentPageIndex - 1).ToString(), imageUrlForUp));
}
if (currentPageIndex != totalPages - 1)
{
sb.Append(string.Format("<a href=\"{0}\"><img src={1} style=\"boder:0px;border-color: #FFFFFF\"/></a>", requestBaseUrl + "/" + (currentPageIndex + 1).ToString(), imageUrlForDown));
}
return sb.ToString();
}
/// <summary>
/// Use arabic numerals and images for paging
/// </summary>
/// <param name="currentPageIndex">current page index</param>
/// <param name="totalPages">total pages</param>
/// <param name="requestBaseUrl">base url and id value construct a whole url, eg:http://baseURL/id</param>
/// <param name="pagesSize">size of page numbers which are displayed </param>
/// <param name="imageUrlForUp">image for previous page</param>
/// <param name="imageUrlForDown">image for next page</param>
/// <returns></returns>
public static string CreatePager(int currentPageIndex, int totalPages, string requestBaseUrl, int pagesSize, string imageUrlForUp, string imageUrlForDown)
{
StringBuilder sb = new StringBuilder();
Validate(currentPageIndex, totalPages, pagesSize);
string href = "javascript:void(0)";
//determine whether there is previous page
if (currentPageIndex / pagesSize != 0)
{
href = string.Format(requestBaseUrl + "/" + ((currentPageIndex / pagesSize) * pagesSize - 1).ToString());
}
sb.Append(string.Format("<a href=\"{0}\"><img src=\"{1}\" style=\"boder:0px;border-color: #FFFFFF\"/></a>", href, imageUrlForUp));
sb.Append(" ");
//the max size of page numbers which are displayed
int pageIndexMaxIncrement = (currentPageIndex / pagesSize + 1) * pagesSize > totalPages ? totalPages - pagesSize * (currentPageIndex / pagesSize) : pagesSize;
//inital page number
int pageIndex = pagesSize * (int)(currentPageIndex / pagesSize);
for (int i = 0; i < pageIndexMaxIncrement; i++)
{
if (pageIndex == currentPageIndex)
{
sb.Append(string.Format("<a href='{0}' style='{2}'>{1}</a>", "javascript:void(0)", (pageIndex + 1).ToString(), "text-decoration:none;"));
}
else
{
sb.Append(string.Format("<a href='{0}'>{1}</a>", requestBaseUrl + "/" + pageIndex.ToString(), (pageIndex + 1).ToString()));
}
sb.Append(" ");
pageIndex++;
}
href = "javascript:void(0)";
//determine whether there is next page
if (pageIndex < totalPages - 1)
{
href = string.Format(requestBaseUrl + "/" +pageIndex.ToString());// ((currentPageIndex / pagesSize + 1) * pagesSize - 1).ToString());
}
sb.Append(string.Format("<a href=\"{0}\"><img src=\"{1}\" style=\"boder:0px;border-color: #FFFFFF\"/></a>", href, imageUrlForDown));
return sb.ToString();
}
/// <summary>
/// customize html helper method
/// </summary>
/// <param name="htmlHelper">HtmlHelper</param>
/// <param name="pager">Pager</param>
/// <returns></returns>
public static string CreatePager<T>(this HtmlHelper htmlHelper, Pager<T> pager)
{
if (string.IsNullOrEmpty(pager.ImageUrlForDown.ToString()) || string.IsNullOrEmpty(pager.ImageUrlForUp.ToString()))
{
return CreatePager(pager.CurrentPageIndex, pager.TotalPages, pager.RequestBaseUrl);
}
else if (pager.PagesSize <= 1)
{
return CreatePager(pager.CurrentPageIndex, pager.TotalPages, pager.RequestBaseUrl, pager.ImageUrlForUp.ToString(), pager.ImageUrlForDown.ToString());
}
else
{
return CreatePager(pager.CurrentPageIndex, pager.TotalPages, pager.RequestBaseUrl, pager.PagesSize, pager.ImageUrlForUp.ToString(), pager.ImageUrlForDown.ToString());
}
}
private static void Validate(int currentPageIndex, int totalPages)
{
if (currentPageIndex < 0)
{
throw new Exception("The current page indx must not be less than zero");
}
if (totalPages < 1)
{
throw new Exception("The total pages must not be less than 1");
}
if (currentPageIndex > totalPages - 1)
{
throw new Exception("The current page index can't be greater than total pages");
}
}
private static void Validate(int currentPageIndex, int totalPages, int pagesSize)
{
Validate(currentPageIndex, totalPages);
if (pagesSize < 0)
{
throw new Exception("The page size must be greater thatn zero");
}
}
}
}
代码
public ActionResult Index(int ? id)
{
int pageIndex = Convert.ToInt32(id);
List<Employee> empList=EmployeeSet.Employees;
int pagesSize = 5;
Pager<Employee> pager = new Pager<Employee>(empList , pageIndex, Url.Content("~/Home/Index"), Url.Content("~/images/left.gif"), Url.Content("~/images/right.gif"), pagesSize);
ViewData["pager"] =pager;
return View(empList.Skip(pager.pageSize * pageIndex).Take(pager.pageSize));
}
{
int pageIndex = Convert.ToInt32(id);
List<Employee> empList=EmployeeSet.Employees;
int pagesSize = 5;
Pager<Employee> pager = new Pager<Employee>(empList , pageIndex, Url.Content("~/Home/Index"), Url.Content("~/images/left.gif"), Url.Content("~/images/right.gif"), pagesSize);
ViewData["pager"] =pager;
return View(empList.Skip(pager.pageSize * pageIndex).Take(pager.pageSize));
}
<%=Html.CreatePager<Employee>(ViewData["pager"] as Pager<Employee>)%>
上面的三段代码,写出Page控件的定义和应用。Page控件的定义,我认为不是很实用,有点太繁琐。因为每个项目中所有的分页样式应该是统一的,我们可以通过在config中做相应的配置,来达到自己的目的。此示例中有一个缺点就是把前后翻页的图片写在Controller中。这是在做项目的角度来分析的,但是对于一个简单的示例这样我感觉很完美了。读了这个例子之后,对于分页我的思路又开阔一些。
理想很遥远,但是每天我们都要坚持为理想做点什么。