Cool MVC:一步一步打造完美分页 (续)
上一篇 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
作者:Bruce(编程的艺术世界)
出处:http://coolcode.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。