MVC3 带查询的分页Helper
来源:互联网 发布:管理加载项没有java 编辑:程序博客网 时间:2024/05/06 10:10
接上篇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 else18 {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 else31 {//一般页处理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 try34 {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 catch62 {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.author36 </td>37 <td>38 @item.title39 </td>40 <td>41 @item.ctime42 </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.大功告成!
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- MVC3 带查询的分页Helper
- MVC3 @helper的使用
- ASP.NET MVC3自定义分页Helper
- MVC3分页查询
- 带查询条件的分页
- 带条件的分页查询
- 带分页的sqlserver查询
- 参考的datalist分页helper
- mvc3 app_code @helper @Ajax.ActionLink 失效的解决方法
- 分页带查询的存储过程示例
- asp带查询的分页例子
- Extjs grid带分页的查询
- 带查询条件的分页实例
- YII带查询条件的分页问题解决
- JdbcTemplate带参数的分页查询
- hibernate中带查询条件的分页
- MVC3 分页
- 用@Html.EditorFor在MVC3中封装带表单(Form)提交的分页控件(通用代码)
- POJ 1195 Mobile phones【二维树状数组】
- 小学生算术
- ruby 截断truncate、单复数pluralize
- 用笔记本建立虚拟wifi
- MSSQL日期函数
- MVC3 带查询的分页Helper
- Android中从服务器端向客户端传数据[json]
- qq音乐 api
- hdu-Hero
- Java操作json的通用类
- 数学
- hdu 2546 饭卡 (01背包)
- 最短路题目整理 Poj 2387 + 3259 + 2502 + 1847
- 测试的双重目的性及理性质量观