這兩天一直在搞MVC 2.0的查詢后分頁,分頁控件用的MikePager。
剛開始用的MikePagerAjaxExtensions.cs,代碼如下:
1 using System; 2 using System.Text; 3 using System.Web.Routing; 4 5 namespace System.Web.Mvc 6 { 7 public static class MikePagerAjaxExtensions 8 { 9 #region MikePager 分頁控件 10 11 public static string MikePager<T>(this AjaxHelper html, PagedList<T> data) 12 { 13 14 int start = (data.PageIndex - 5) >= 1 ? (data.PageIndex - 5) : 1; 15 int end = (data.TotalPage - start) > 10 ? start + 10 : data.TotalPage; 16 17 RouteValueDictionary vs = html.ViewContext.RouteData.Values; 18 var queryString = html.ViewContext.HttpContext.Request.QueryString; 19 foreach (string key in queryString.Keys) 20 vs[key] = queryString[key]; 21 22 var FormString = html.ViewContext.HttpContext.Request.Form; 23 foreach (string key in FormString.Keys) 24 vs[key] = FormString[key]; 25 26 string Formstring = FormString.ToString().Replace("&", ","); 27 28 //var url = html.ViewContext.HttpContext.Request.Url; 29 var url1 = html.ViewContext.HttpContext.Request.RawUrl; 30 var builder = new StringBuilder(); 31 builder.AppendFormat("<div class=\"mike_mvc_pager\">"); 32 33 //vs["pageSize"] = data.PageSize; 34 if (data.IsPreviousPage) 35 { 36 vs["pageIndex"] = 1; 37 38 builder.Append(Ajax.AjaxExtensions.ActionLink(html, "首頁", vs["action"].ToString(), vs, new Ajax.AjaxOptions() { LoadingElementId = "Loading", UpdateTargetId = "Main" }, new { onclick = "$(function(){$.jBox.tip('正在處理...', 'loading');});" })); 39 40 vs["pageIndex"] = data.PageIndex - 1; 41 42 builder.Append(Ajax.AjaxExtensions.ActionLink(html, "上一頁", vs["action"].ToString(), vs, new Ajax.AjaxOptions() { LoadingElementId = "Loading", UpdateTargetId = "Main" }, new { onclick = "$(function(){$.jBox.tip('正在處理...', 'loading');});" })); 43 44 } 45 46 for (int i = start; i <= end; i++) //前后各顯示5個數字頁碼 47 { 48 vs["pageIndex"] = i; 49 50 if (i == data.PageIndex) 51 { 52 builder.Append("<font class='thispagethis ui-state-default'>" + i.ToString() + "</font>"); 53 } 54 else 55 { 56 builder.Append(Ajax.AjaxExtensions.ActionLink(html, i.ToString(), vs["action"].ToString(), vs, new Ajax.AjaxOptions() { LoadingElementId = "Loading", UpdateTargetId = "Main" }, new { onclick = "$(function(){$.jBox.tip('正在處理...', 'loading');});" })); 57 } 58 } 59 60 if (data.IsNextPage) 61 { 62 vs["pageIndex"] = data.PageIndex + 1; 63 64 builder.Append(Ajax.AjaxExtensions.ActionLink(html, "下一頁", vs["action"].ToString(), vs, new Ajax.AjaxOptions() { LoadingElementId = "Loading", UpdateTargetId = "Main" }, new { onclick = "$(function(){$.jBox.tip('正在處理...', 'loading');});" })); 65 66 vs["pageIndex"] = data.TotalPage; 67 68 builder.Append(Ajax.AjaxExtensions.ActionLink(html, "末頁", vs["action"].ToString(), vs, new Ajax.AjaxOptions() { LoadingElementId = "Loading", UpdateTargetId = "Main" }, new { onclick = "$(function(){$.jBox.tip('正在處理...', 'loading');});" })); 69 70 } 71 builder.Append("每頁" + data.PageSize + "條/共" + data.TotalCount + "條 第" + data.PageIndex + "頁/共" + data.TotalPage + "頁 </div>"); 72 return builder.ToString(); 73 } 74 #endregion 75 76 } 77 }
前台搜索的form為:
1 <%using(Ajax.BeginForm(new AjaxOptions{})){ %> 2 <div> 3 4 <%=Html.TextBox("keyword")%> 5 <%=Html.DropDownList("input1", new List<SelectListItem>{new SelectListItem{Text=""},new SelectListItem{Text="男"},new SelectListItem{Text="女"}}) %> 6 <%=Html.DropDownList("pageSize", new List<SelectListItem> { new SelectListItem { Text = "" }, new SelectListItem { Text = "5",Value="5" }, new SelectListItem { Text = "10",Value="10" }, new SelectListItem { Text = "15",Value="15" }, new SelectListItem { Text = "20",Value="20" } })%> 7 <input id="pageIndex" name="pageIndex" type="hidden" value="pageIndex" /> 8 <input type="submit" onclick="$(function(){$.jBox.tip('正在處理...', 'loading');});" value="搜索"/> 9 </div> 10 <%} %>
點擊后搜索成功,也可以分頁,但是點擊分頁控件時,不能保留Url參數,譬如:選擇性別Sex=“0”(男),頁數pageSize=5,
點擊分頁控件查看下一頁,本來的URL應該是http://localhost:42735/Manager.aspx/Sys_Controllers/Index/System.Web.Mvc.UrlParameter/2?pageSize=5&Sex=0
但是實際點擊后的Url為:http://localhost:42735/Manager.aspx/Sys_Controllers/Index/System.Web.Mvc.UrlParameter/2?Count=3&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D
如果想保留Url參數,則需要修改MikePagerAjaxExtensions.cs中的
1 Ajax.AjaxExtensions.ActionLink(html, i.ToString(), vs["action"].ToString(), vs, new Ajax.AjaxOptions() { LoadingElementId = "Loading", UpdateTargetId = "Main" }, new { onclick = "$(function(){$.jBox.tip('正在處理...', 'loading');});" })
為:
Ajax.AjaxExtensions.ActionLink(html, i.ToString(), vs["action"].ToString(), new{pageSize=vs["pageSize"],Sex=vs["Sex"]}, new Ajax.AjaxOptions() { LoadingElementId = "Loading", UpdateTargetId = "Main" }, new { onclick = "$(function(){$.jBox.tip('正在處理...', 'loading');});" })
暫時沒有其他的解決方法。但是這種方法用在系統中很不方便,然后使用MikePagerHtmlExtensions.cs后可以完美的保留Url中的參數,代碼為:
1 using System.Text; 2 using System.Web.Routing; 3 4 namespace System.Web.Mvc 5 { 6 public static class MikePagerHtmlExtensions 7 { 8 9 #region MikePager 分頁控件 10 11 public static string MikePager<T>(this HtmlHelper html, PagedList<T> data) 12 { 13 int start = (data.PageIndex - 5) >= 1 ? (data.PageIndex - 5) : 1; 14 int end = (data.TotalPage - start) > 10 ? start + 10 : data.TotalPage; 15 16 RouteValueDictionary vs = html.ViewContext.RouteData.Values; 17 18 var queryString = html.ViewContext.HttpContext.Request.QueryString; 19 foreach (string key in queryString.Keys) 20 //if (queryString[key] != null && !string.IsNullOrEmpty(key)) 21 vs[key] = queryString[key]; 22 23 var FormString = html.ViewContext.HttpContext.Request.Form; 24 foreach (string key in FormString.Keys) 25 vs[key] = FormString[key]; 26 27 var builder = new StringBuilder(); 28 builder.AppendFormat("<div class=\"mike_mvc_pager\">"); 29 30 if (data.IsPreviousPage) 31 { 32 vs["pageIndex"] = 1; 33 builder.Append(Html.LinkExtensions.ActionLink(html, "首頁", vs["action"].ToString(), vs)); 34 vs["pageIndex"] = data.PageIndex - 1; 35 builder.Append(Html.LinkExtensions.ActionLink(html, "上一頁", vs["action"].ToString(), vs)); 36 } 37 38 for (int i = start; i <= end; i++) //前后各顯示5個數字頁碼 39 { 40 vs["pageIndex"] = i; 41 if (i == data.PageIndex) 42 { 43 builder.Append("<font class='thispagethis ui-state-default'>" + i.ToString() + "</font>"); 44 } 45 else 46 { 47 builder.Append(Html.LinkExtensions.ActionLink(html, i.ToString(), vs["action"].ToString(), vs)); 48 } 49 } 50 51 if (data.IsNextPage) 52 { 53 vs["pageIndex"] = data.PageIndex + 1; 54 builder.Append(Html.LinkExtensions.ActionLink(html, "下一頁", vs["action"].ToString(), vs)); 55 vs["pageIndex"] = data.TotalPage; 56 builder.Append(Html.LinkExtensions.ActionLink(html, "末頁", vs["action"].ToString(), vs)); 57 } 58 builder.Append("每頁" + data.PageSize + "條/共" + data.TotalCount + "條 第" + data.PageIndex + "頁/共" + data.TotalPage + "頁 </div>"); 59 return builder.ToString(); 60 } 61 #endregion 62 63 } 64 }
對了,我的Global.asax.cs代碼是:
1 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 2 3 routes.MapRoute( 4 "Root", 5 "", 6 new { controller = "Index", action = "Index" }, 7 new string[] { "Web.Controllers" } 8 ); 9 10 routes.MapRoute( 11 "Default", // Route name 12 "{controller}.aspx/{action}/{id}/{pageIndex}", // URL with parameters 13 new { controller = "Index", action = "Index", id = UrlParameter.Optional, pageIndex = UrlParameter.Optional }, // Parameter defaults 14 new string[] { "Web.Controllers" } 15 );
上面都是這兩天搞的東西,對於ajax的MikePager我只能用到那種方法,如果那位看到這篇文章的大哥大姐有更好的方法,請貼出來共享一下,目前我用了html方式的MikePager可以保留Url參數@;
