摘要:[ASP.NET MVC]Pager Link
在MVC中網頁的功能幾乎都要自已來,不像ASP.NET Web Form有許多好用的控制項,有好也有壞,有時候練練功也不錯,最近找了幾個有關MVC中的資料分頁連結,都沒有說很喜歡,想說自已動手做一個也順便練練功,正在思考分頁外觀要如何設計呢 ,就拿我常逛的點部落裡的分頁連結動手練功。
設定路由,PageIndex由1開始
routes.MapRoute( "OrderPager", "Order/{page}", new { controller = "OrderPager", action = "Index", page = 1 }, new { page = @"\d*" } );
controller
public class OrderPagerController : Controller { private OrdersRepository repository = new OrdersRepository(); public ActionResult Index(int page) { Pager customPager = new Pager { PageIndex = page, PageSize = 15, ItemTotalCount = repository.GetOrdersCount() }; ViewData["customPager"] = customPager; return View(repository.GetOrders(page, customPager.PageSize)); } }
model
public class Orders { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } public class OrdersRepository { private List<Orders> _orders = new List<Orders>(); public OrdersRepository() { Random r = new Random(); //2000筆假資料 for (int i = 1; i <= 2000; i++) { Orders _o = new Orders { Id = i, Name = "orders_" + i.ToString(), Price = r.Next(1000) }; _orders.Add(_o); } } public IEnumerable<Orders> GetOrders(int pageIndex, int pageSize) { return _orders.Skip((pageIndex - 1) * pageSize).Take(pageSize); } public int GetOrdersCount() { return _orders.Count; }
view
<p> <%= Html.PagerHelper(ViewData["customPager"] as Pager, string.Empty, null) %> </p>
CSS
<style type="text/css"> .Pager { text-align:left; padding:3px; margin: 8px 3px; font-size:14px; } .Pager a { border:#c0c0c0 1px solid; text-align:center; padding: 3px 7px; margin:2px; color: #0066cc; text-decoration:none; } .Pager .Current { background-color:#0066cc; margin-top:4px; color:#ffffff ; font-weight:bold; } </style>
===============================================================================
分頁:PagerHelper
public class Pager { public int PageIndex { get; set; } public int PageSize { get; set; } public int ItemTotalCount { get; set; } public int PageCount { get { return (int)Math.Ceiling((double)ItemTotalCount / PageSize); } } }
helper extenstion
public static class PagerExtension { public static string PagerHelper(this HtmlHelper helper, Pager pager, string action, RouteValueDictionary routeValues) { if (routeValues == null) routeValues = new RouteValueDictionary(); if (!string.IsNullOrEmpty(action)) if(!routeValues.ContainsKey("action")) routeValues.Add("action", action); StringBuilder sb = new StringBuilder(); sb.Append("<div class=\"Pager\">"); // 目前頁數非第1頁顯示「上一頁」連結 if (pager.PageIndex > 1) sb.Append(GeneratePageLink("上一頁", pager.PageIndex - 1, helper, routeValues, null)); // 「<<(前10頁)」 與 「First(第一頁)」連結 if (pager.PageIndex - 4 > 1) { sb.Append(GeneratePageLink("First", 1, helper, routeValues, null)); sb.Append(GeneratePageLink("<<", (pager.PageIndex - 10 >= 1) ? pager.PageIndex - 10 : 1, helper, routeValues, null)); } // pageNumber : [4 / 1(Current) / 4] #region 設定顯示頁數的起始值 int below = pager.PageIndex - 4; int above = pager.PageIndex + 4; if (below < 1)/*PageIndex 為最前4頁*/ { below = 1; above = pager.PageCount >= below + 8 ? below + 8 : pager.PageCount; } if (above > pager.PageCount)/*PageIndex 為最後4頁*/ { above = pager.PageCount; below = pager.PageCount - 9 < 1 ? 1 : pager.PageCount - 9; } #endregion for (int i = below; i <= above; i++) { //目前頁數設定Css Class Name Current object htmlAttributes = null; if(i == pager.PageIndex) htmlAttributes = new { @class = "Current" }; sb.Append(GeneratePageLink(i.ToString(), i, helper, routeValues, htmlAttributes)); } // 「<<(後10頁)」 與 「Last(最後一頁)」連結 if (pager.PageIndex + 4 < pager.PageCount) { sb.Append(GeneratePageLink(">>", (pager.PageIndex + 10 <= pager.PageCount) ? pager.PageIndex + 10 : pager.PageCount, helper, routeValues, null)); sb.Append(GeneratePageLink("Last", pager.PageCount, helper, routeValues, null)); } // 目前頁數非最後1頁顯示「下一頁」連結 if (pager.PageIndex < pager.PageCount) { sb.Append(GeneratePageLink("下一頁", pager.PageIndex + 1, helper, routeValues, null)); } sb.Append("</div>"); return sb.ToString(); } private static string GeneratePageLink(string linkText, int linkPageIndex, HtmlHelper helper, RouteValueDictionary routeValues, object htmlAttributes) { var htmlAttr = new RouteValueDictionary(htmlAttributes); htmlAttr.Add("title", "page"); var pageLinkValueDictionary = new RouteValueDictionary(routeValues); pageLinkValueDictionary.Add("page", linkPageIndex); return helper.RouteLink(linkText, pageLinkValueDictionary, htmlAttr); } }
↓程式下載↓
DemoPager.rar