接上篇mvc3 分页Helper.
带查询的分页Helper是在上一篇分页的基础上来的。下面看代码:
首先,在System.Web.Mvc命名空间下的自定义类HtmlPage下面添加一个用于处理“查询字典”的方法UrlGetParameter。
1 /// <summary> 2 /// 根据查询字典,拼写查询参数 3 /// </summary> 4 /// <param name="parameters"></param> 5 /// <returns></returns> 6 public static string UrlGetParameter(Dictionary<string,string> parameters) 7 { 8 if (parameters != null && parameters.Count > 0) 9 { 10 StringBuilder sb = new StringBuilder(); 11 foreach (var item in parameters) 12 { 13 sb.Append("&"+item.Key.ToLower()+"="+item.Value); 14 } 15 return sb.ToString(); 16 } 17 else 18 { 19 return ""; 20 } 21 }
然后,修改HtmlPage类下面的ShowPageNavigate方法如下:
1 public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount,Dictionary<string,string> parameters=null) 2 { 3 var redirectTo = htmlHelper.ViewContext.RequestContext.HttpContext.Request.Url.AbsolutePath; 4 pageSize = pageSize == 0 ? 3 : pageSize; 5 var totalPages = Math.Max((totalCount + pageSize - 1) / pageSize, 1); //总页数 6 string searchCode = string.Empty; 7 if (parameters!=null) 8 { 9 searchCode = UrlGetParameter(parameters); 10 } 11 var output = new StringBuilder(); 12 if (totalPages > 1) 13 { 14 output.AppendFormat("<a class='pageLink' href='{0}?pageIndex=1&pageSize={1}{2}'>首页</a> ", redirectTo, pageSize,searchCode); 15 if (currentPage > 1) 16 {//处理上一页的连接 17 output.AppendFormat("<a class='pageLink' href='{0}?pageIndex={1}&pageSize={2}{3}'>上一页</a> ", redirectTo, currentPage - 1, pageSize,searchCode); 18 } 19 20 output.Append(" "); 21 int currint = 5; 22 for (int i = 0; i <= 10; i++) 23 {//一共最多显示10个页码,前面5个,后面5个 24 if ((currentPage + i - currint) >= 1 && (currentPage + i - currint) <= totalPages) 25 { 26 if (currint == i) 27 {//当前页处理 28 output.AppendFormat("<a class='cpb' href='{0}?pageIndex={1}&pageSize={2}{3}'>{4}</a> ", redirectTo, currentPage, pageSize, searchCode, currentPage); 29 } 30 else 31 {//一般页处理 32 output.AppendFormat("<a class='pageLink' href='{0}?pageIndex={1}&pageSize={2}{4}'>{3}</a> ", redirectTo, currentPage + i - currint, pageSize, currentPage + i - currint,searchCode); 33 } 34 } 35 output.Append(" "); 36 } 37 if (currentPage < totalPages) 38 {//处理下一页的链接 39 output.AppendFormat("<a class='pageLink' href='{0}?pageIndex={1}&pageSize={2}{3}'>下一页</a> ", redirectTo, currentPage + 1, pageSize,searchCode); 40 } 41 42 output.Append(" "); 43 if (currentPage != totalPages) 44 { 45 output.AppendFormat("<a class='pageLink' href='{0}?pageIndex={1}&pageSize={2}{3}'>末页</a> ", redirectTo, totalPages, pageSize,searchCode); 46 } 47 output.Append(" "); 48 } 49 output.AppendFormat("<label>第{0}页 / 共{1}页</label>", currentPage, totalPages);//这个统计加不加都行 50 51 return new HtmlString(output.ToString()); 52 }
其次,还要将"查询字典"属性添加到PageInfo字典中。
1 public class PagerInfo 2 { 3 public int RecordCount { get; set; } 4 5 public int CurrentPageIndex { get; set; } 6 7 public int PageSize { get; set; } 8 //放置查询参数 9 public Dictionary<string, string> SearchParameter { get; set; } 10 }
最后,就要写View和Controller里的内容的。先看Controller的代码,添加一个用于回发的Action即(Index),把get,post的Action都写出来吧。
1 //get /News/Index/? 2 public ActionResult Index(int? pageSize, int? pageIndex, string pauthor, string ptitle) 3 { 4 Dictionary<string, string> pagerParamers = new Dictionary<string, string>(); 5 int pageIndex1 = pageIndex ?? 1; 6 int pageSize1 = pageSize ?? 5; 7 //从数据库在取得数据,并返回总记录数 8 var temp = newsSer.LoadEntities(c => c.del == false).AsQueryable(); 9 PagerInfo pager = new PagerInfo(); 10 pager.CurrentPageIndex = pageIndex1; 11 pager.PageSize = pageSize1; 12 if (!string.IsNullOrEmpty(pauthor)) 13 { 14 pagerParamers.Add("pauthor", pauthor); 15 temp = temp.Where(c => c.author.Contains(pauthor)).AsQueryable(); 16 } 17 if (!string.IsNullOrEmpty(ptitle)) 18 { 19 pagerParamers.Add("ptitle", ptitle); 20 temp=temp.Where(c => c.title.Contains(ptitle)).AsQueryable(); 21 } 22 pager.RecordCount = temp.Count(); 23 pager.SearchParameter = pagerParamers; 24 temp=temp.OrderByDescending(c => c.id).Skip((pageIndex1 - 1) * pageSize1).Take(pageSize1).AsQueryable(); 25 PagerQuery<PagerInfo, IQueryable<news>> query = new PagerQuery<PagerInfo, IQueryable<news>>(pager, temp); 26 return View(query); 27 } 28 29 //Post /News/Index/? 30 [HttpPost] 31 public ActionResult Index(FormCollection form) 32 { 33 try 34 { 35 string pauthor = form["pauthor"]; 36 string ptitle = form["ptitle"]; 37 Dictionary<string, string> pagerParams = new Dictionary<string, string>(); 38 int pageIndex = 1; 39 int pageSize = 5; 40 PagerInfo pager = new PagerInfo(); 41 pager.CurrentPageIndex = pageIndex; 42 pager.PageSize = pageSize; 43 //从数据库在取得数据,并返回总记录数 44 var temp = newsSer.LoadEntities(c => c.author.Contains(pauthor)).AsQueryable(); 45 if (!string.IsNullOrEmpty(pauthor)) 46 { 47 pagerParams.Add("pauthor", pauthor); 48 temp = temp.Where(c => c.author.Contains(pauthor) && c.del == false).AsQueryable(); 49 } 50 if (!string.IsNullOrEmpty(ptitle)) 51 { 52 pagerParams.Add("ptitle", ptitle); 53 temp = temp.Where(c => c.title.Contains(ptitle)).AsQueryable(); 54 } 55 pager.RecordCount = temp.Count(); 56 pager.SearchParameter = pagerParams; 57 temp = temp.OrderBy(c => c.id).Skip((pageIndex - 1) * pageSize).Take(pageSize); 58 PagerQuery<PagerInfo, IQueryable<news>> query = new PagerQuery<PagerInfo, IQueryable<news>>(pager, temp); 59 return View(query); 60 } 61 catch 62 { 63 return View(); 64 } 65 }
接下来,看一下View中的代码:
1 @using (Html.BeginForm("Index", "News", FormMethod.Post, new { @class = "well" })) 2 { 3 <input type="text" id="pauthor" class="search-query" name="pauthor" placeholder="作者" /> 4 <input type="text" id="ptitle" class="search-query" name="ptitle" placeholder="标题" /> 5 <input type="submit" class="btn" value="查询" /> 6 } 7 <table style="margin-top: 10px;"> 8 <thead> 9 <tr> 10 <th width="25"> 11 <input class="select-all" name="" type="checkbox" value="" /> 12 </th> 13 <th> 14 作者 15 </th> 16 <th> 17 新闻标题 18 </th> 19 <th> 20 创建时间 21 </th> 22 <th> 23 操作 24 </th> 25 </tr> 26 </thead> 27 <tbody> 28 @foreach (var item in Model.EntityList) 29 { 30 <tr> 31 <td class="checkBox"> 32 <input name="ids[]" type="checkbox" value="" /> 33 </td> 34 <td> 35 @item.author 36 </td> 37 <td> 38 @item.title 39 </td> 40 <td> 41 @item.ctime 42 </td> 43 <td> 44 @Html.ActionLink("编辑", "Edit", new { id = item.id }) | 45 @Html.ActionLink("删除", "Delete", new { id = item.id }) 46 </td> 47 </tr> 48 } 49 @*分页*@ 50 <tr class=""> 51 <td colspan="5" align="center" class="paginator"> 52 <span> 53 @Html.ShowPageNavigate(Model.Pager.CurrentPageIndex, Model.Pager.PageSize, Model.Pager.RecordCount, Model.Pager.SearchParameter) 54 </span> 55 </td> 56 </tr> 57 </tbody> 58 </table>
分页的样式见上一节"MVC# 分页Helper",查询表单的样式,就不再列出了。
最后再补充一下,如果在查询时依然想要使用以前的PageSize(当然了,这里的PageSize是固定的),可以在进行请求时将pageSize保存在ViewBag中,然后在View中将它保存在表单的隐藏域中,这样就可以使用设置好的pageSize了。(页面跳转、上n页、下n页,这里就不列出来了。)
最终的效果图:
ok.大功告成!