上一篇 Cool MVC:一步一步打造完美分頁 , 部分朋友反映不知道怎麼用。我以為我已經寫的太詳細了,畢竟在blog上貼太多代碼不雅觀。 這次做了個完整的例子,並附上代碼供有需要的人下載,估計不會再有人問怎麼用了。
其實上一篇的代碼有兩小bug,
1. 一般分頁的url假如是這樣形式: /Home/Index/Page/1,第一頁可以不顯示頁號,也就是當不指定頁號時,url就是:/Home/Index。這時候如果按下一頁,原來的代碼就會報錯說找不到“page”關鍵字了。
2. 丟失查詢字元,如果url是:/Home/Index?Page=1&user=Bruce, 那麼按下一頁以後就會變成這樣:/Home/Index?Page=2, 丟失了後面的user=Bruce
這裡附上修正後的代碼:
public static class PagerHelper { /// <summary> /// 分頁Pager顯示 /// </summary> /// <param name="html"></param> /// <param name="currentPageStr">標識當前頁碼的QueryStringKey</param> /// <param name="pageSize">每頁顯示</param> /// <param name="totalCount">總資料量</param> /// <returns></returns> public static string Pager(this HtmlHelper html, string currentPageStr, int pageSize, int totalCount) { var queryString = html.ViewContext.HttpContext.Request.QueryString; int currentPage = 1; //當前頁 var totalPages = Math.Max((totalCount + pageSize - 1) / pageSize, 1); //總頁數 var dict = new System.Web.Routing.RouteValueDictionary(html.ViewContext.RouteData.Values); var output = new StringBuilder(); if (!string.IsNullOrEmpty(queryString[currentPageStr])) { //與相應的QueryString綁定 foreach (string key in queryString.Keys) if (queryString[key] != null && !string.IsNullOrEmpty(key)) dict[key] = queryString[key]; int.TryParse(queryString[currentPageStr], out currentPage); } else { //擷取 ~/Page/{page number} 的頁號參數 if (dict.ContainsKey(currentPageStr)) int.TryParse(dict[currentPageStr].ToString(), out currentPage); } //保留查詢字元到下一頁 foreach (string key in queryString.Keys) dict[key] = queryString[key]; //如果有需要,保留表單值到下一頁 (我暫時不需要, 所以注釋掉) //var formValue = html.ViewContext.HttpContext.Request.Form; //foreach (string key in formValue.Keys) // if (formValue[key] != null && !string.IsNullOrEmpty(key)) // dict[key] = formValue[key]; if (currentPage <= 0) currentPage = 1; if (totalPages > 1) { if (currentPage != 1) { //處理首頁串連 dict[currentPageStr] = 1; output.AppendFormat("{0} ", html.RouteLink("首頁", dict)); } if (currentPage > 1) { //處理上一頁的串連 dict[currentPageStr] = currentPage - 1; output.Append(html.RouteLink("上一頁", dict)); } else { output.Append("上一頁"); } output.Append(" "); int currint = 5; for (int i = 0; i <= 10; i++) { //一共最多顯示10個頁碼,前面5個,後面5個 if ((currentPage + i - currint) >= 1 && (currentPage + i - currint) <= totalPages) if (currint == i) { //當前頁處理 output.Append(string.Format("[{0}]", currentPage)); } else { //一般頁處理 dict[currentPageStr] = currentPage + i - currint; output.Append(html.RouteLink((currentPage + i - currint).ToString(), dict)); } output.Append(" "); } if (currentPage < totalPages) { //處理下一頁的連結 dict[currentPageStr] = currentPage + 1; output.Append(html.RouteLink("下一頁", dict)); } else { output.Append("下一頁"); } output.Append(" "); if (currentPage != totalPages) { dict[currentPageStr] = totalPages; output.Append(html.RouteLink("末頁", dict)); } output.Append(" "); } output.AppendFormat("{0} / {1}", currentPage, totalPages);//這個統計加不加都行 return output.ToString(); } }
最後附上一個完整的使用例子:MvcPaging.rar