MikePager中Url參數保留 MVC 查詢 分頁


這兩天一直在搞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參數@;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM