ASP.NET MVC Pager Helper Extensions
正在做一个基本于MVC的项目,要用到分页,于是花了点时间,自已写了一个!
功能和效果和http://www.cnblogs.com/的完全一样,呵呵!
比cnblogs的多了一点点小东西,可以输入分页码跳转.
注:转载请注明:0x001.com原创,下载请看附件,在项目中引用即可
下载地址:Sov.pager.dll
运行效果:
Html Helper的代码:
1 namespace System.Web.Mvc
2 {
3 public static class PagerHelper
4 {
5 private const int defaultDisplayCount = 11;
6
7 #region HtmlHelper Extensions
8
9 /// <summary>
10 /// Pager Helper Extensions
11 /// </summary>
12 /// <param name="htmlHelper"></param>
13 /// <param name="currentPage">当前页码</param>
14 /// <param name="pageSize">页面显示的数据条目</param>
15 /// <param name="totalCount">总记录数</param>
16 /// <param name="toDisplayCount">Helper要显示的页数</param>
17 /// <returns></returns>
18 public static string Pager(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount, int toDisplayCount)
19 {
20 RenderPager pager = new RenderPager(htmlHelper.ViewContext,currentPage, pageSize,totalCount,toDisplayCount);
21
22 return pager.RenderHtml();
23 }
24
25 /// <summary>
26 /// Pager Helper Extensions
27 /// </summary>
28 /// <param name="htmlHelper"></param>
29 /// <param name="currentPage">当前页码</param>
30 /// <param name="pageSize">页面显示的数据条目</param>
31 /// <param name="totalCount">总记录数</param>
32 /// <returns></returns>
33 public static string Pager(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount)
34 {
35 RenderPager pager = new RenderPager(htmlHelper.ViewContext, currentPage, pageSize, totalCount,defaultDisplayCount);
36
37 return pager.RenderHtml();
38 }
39
40 /// <summary>
41 /// IEnumerable extensions
42 /// </summary>
43 public static PageList<T> ToPageList<T>(this IEnumerable<T> source, int pageIndex, int pageSize, int totalCount)
44 {
45 return new PageList<T>(source, pageIndex, pageSize, totalCount);
46 }
47
48 #endregion
49 }
50 }
2 {
3 public static class PagerHelper
4 {
5 private const int defaultDisplayCount = 11;
6
7 #region HtmlHelper Extensions
8
9 /// <summary>
10 /// Pager Helper Extensions
11 /// </summary>
12 /// <param name="htmlHelper"></param>
13 /// <param name="currentPage">当前页码</param>
14 /// <param name="pageSize">页面显示的数据条目</param>
15 /// <param name="totalCount">总记录数</param>
16 /// <param name="toDisplayCount">Helper要显示的页数</param>
17 /// <returns></returns>
18 public static string Pager(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount, int toDisplayCount)
19 {
20 RenderPager pager = new RenderPager(htmlHelper.ViewContext,currentPage, pageSize,totalCount,toDisplayCount);
21
22 return pager.RenderHtml();
23 }
24
25 /// <summary>
26 /// Pager Helper Extensions
27 /// </summary>
28 /// <param name="htmlHelper"></param>
29 /// <param name="currentPage">当前页码</param>
30 /// <param name="pageSize">页面显示的数据条目</param>
31 /// <param name="totalCount">总记录数</param>
32 /// <returns></returns>
33 public static string Pager(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount)
34 {
35 RenderPager pager = new RenderPager(htmlHelper.ViewContext, currentPage, pageSize, totalCount,defaultDisplayCount);
36
37 return pager.RenderHtml();
38 }
39
40 /// <summary>
41 /// IEnumerable extensions
42 /// </summary>
43 public static PageList<T> ToPageList<T>(this IEnumerable<T> source, int pageIndex, int pageSize, int totalCount)
44 {
45 return new PageList<T>(source, pageIndex, pageSize, totalCount);
46 }
47
48 #endregion
49 }
50 }
输出显示代码:
1 namespace Sov.Pager
2 {
3 public class RenderPager
4 {
5 #region 字段
6
7 /// <summary>
8 /// 当前页面的ViewContext
9 /// </summary>
10 private ViewContext viewContext;
11 /// <summary>
12 /// 当前页码
13 /// </summary>
14 private readonly int currentPage;
15 /// <summary>
16 /// 页面要显示的数据条数
17 /// </summary>
18 private readonly int pageSize;
19 /// <summary>
20 /// 总的记录数
21 /// </summary>
22 private readonly int totalCount;
23 /// <summary>
24 /// Pager Helper 要显示的页数
25 /// </summary>
26 private readonly int toDisplayCount;
27
28 private readonly string pagelink;
29
30 #endregion
31
32 #region 构造函数
33
34 public RenderPager(ViewContext viewContext, int currentPage, int pageSize, int totalCount, int toDisplayCount)
35 {
36 this.viewContext = viewContext;
37 this.currentPage = currentPage;
38 this.pageSize = pageSize;
39 this.totalCount = totalCount;
40 this.toDisplayCount = toDisplayCount;
41
42
43 string reqUrl = viewContext.RequestContext.HttpContext.Request.RawUrl;
44 string link = "";
45
46 Regex re = new Regex(@"page=(\d+)|page=", RegexOptions.IgnoreCase);
47
48 MatchCollection results = re.Matches(reqUrl);
49
50 if (results.Count > 0)
51 {
52 link = reqUrl.Replace(results[0].ToString(), "page=[%page%]");
53 }
54 else if (reqUrl.IndexOf("?") < 0)
55 {
56 link = reqUrl + "?page=[%page%]";
57 }
58 else
59 {
60 link = reqUrl + "&page=[%page%]";
61 }
62 this.pagelink = link;
63 }
64
65 #endregion
66
67 #region 方法
68
69 public string RenderHtml()
70 {
71 if (totalCount <= pageSize)
72 return string.Empty;
73
74 //总页数
75 int pageCount = (int)Math.Ceiling(this.totalCount / (double)this.pageSize);
76
77 //起始页
78 int start = 1;
79
80 //结束页
81 int end = toDisplayCount;
82 if (pageCount < toDisplayCount) end = pageCount;
83
84 //中间值
85 int centerNumber = toDisplayCount / 2;
86
87 if (pageCount > toDisplayCount)
88 {
89
90 //显示的第一位
91 int topNumber = currentPage - centerNumber;
92
93 if (topNumber > 1)
94 {
95 start = topNumber;
96 }
97
98 if (topNumber > pageCount - toDisplayCount)
99 {
100 start = pageCount - toDisplayCount + 1;
101 }
102
103 //显示的最后一位
104 int endNumber = currentPage + centerNumber;
105
106 if (currentPage >= pageCount - centerNumber)
107 {
108 end = pageCount;
109 }
110 else
111 {
112 if (endNumber > toDisplayCount)
113 {
114 end = endNumber;
115 }
116 }
117
118 }
119
120 StringBuilder sb = new StringBuilder();
121
122 //Previous
123 if (this.currentPage > 1)
124 {
125 sb.Append(GeneratePageLink("< Prev", this.currentPage - 1));
126 }
127
128 if (start > 1)
129 {
130 sb.Append(GeneratePageLink("1", 1));
131 sb.Append("...");
132 }
133
134 //end Previous
135
136 for (int i = start; i <= end; i++)
137 {
138 if (i == this.currentPage)
139 {
140 sb.AppendFormat("<span class=\"current\">{0}</span>", i);
141 }
142 else
143 {
144 sb.Append(GeneratePageLink(i.ToString(), i));
145 }
146 }
147
148 //Next
149 if (end < pageCount)
150 {
151 sb.Append("...");
152 sb.Append(GeneratePageLink(pageCount.ToString(), pageCount));
153 }
154
155 if (this.currentPage < pageCount)
156 {
157 sb.Append(GeneratePageLink("Next >", this.currentPage + 1));
158 }
159 //end Next
160
161 sb.Append("<span><input type=\"text\" class=\"pagerInput\" id=\"pagerInput\" maxlength=\"4\" onkeypress=\"return event.keyCode>=48&&event.keyCode<=57\"/></span>");
162 sb.Append("<span><input type=\"button\" value=\"跳转\" class=\"pagerButton\" onclick=\"if (!isNaN(parseInt(pagerInput.value))) window.location='" + this.pagelink.Replace("[%page%]", "") + "'+pagerInput.value;\"/></span>");
163
164 return sb.ToString();
165 }
166
167 /// <summary>
168 /// 生成Page的链接
169 /// </summary>
170 /// <param name="linkText">文字</param>
171 /// <param name="PageNumber">页码</param>
172 /// <returns></returns>
173 private string GeneratePageLink(string linkText, int PageNumber)
174 {
175
176 string linkFormat = string.Format("<a href=\"{0}\">{1}</a>", this.pagelink.Replace("[%page%]", PageNumber.ToString()), linkText);
177
178 return linkFormat;
179
180 }
181
182 #endregion
183 }
184 }
185
2 {
3 public class RenderPager
4 {
5 #region 字段
6
7 /// <summary>
8 /// 当前页面的ViewContext
9 /// </summary>
10 private ViewContext viewContext;
11 /// <summary>
12 /// 当前页码
13 /// </summary>
14 private readonly int currentPage;
15 /// <summary>
16 /// 页面要显示的数据条数
17 /// </summary>
18 private readonly int pageSize;
19 /// <summary>
20 /// 总的记录数
21 /// </summary>
22 private readonly int totalCount;
23 /// <summary>
24 /// Pager Helper 要显示的页数
25 /// </summary>
26 private readonly int toDisplayCount;
27
28 private readonly string pagelink;
29
30 #endregion
31
32 #region 构造函数
33
34 public RenderPager(ViewContext viewContext, int currentPage, int pageSize, int totalCount, int toDisplayCount)
35 {
36 this.viewContext = viewContext;
37 this.currentPage = currentPage;
38 this.pageSize = pageSize;
39 this.totalCount = totalCount;
40 this.toDisplayCount = toDisplayCount;
41
42
43 string reqUrl = viewContext.RequestContext.HttpContext.Request.RawUrl;
44 string link = "";
45
46 Regex re = new Regex(@"page=(\d+)|page=", RegexOptions.IgnoreCase);
47
48 MatchCollection results = re.Matches(reqUrl);
49
50 if (results.Count > 0)
51 {
52 link = reqUrl.Replace(results[0].ToString(), "page=[%page%]");
53 }
54 else if (reqUrl.IndexOf("?") < 0)
55 {
56 link = reqUrl + "?page=[%page%]";
57 }
58 else
59 {
60 link = reqUrl + "&page=[%page%]";
61 }
62 this.pagelink = link;
63 }
64
65 #endregion
66
67 #region 方法
68
69 public string RenderHtml()
70 {
71 if (totalCount <= pageSize)
72 return string.Empty;
73
74 //总页数
75 int pageCount = (int)Math.Ceiling(this.totalCount / (double)this.pageSize);
76
77 //起始页
78 int start = 1;
79
80 //结束页
81 int end = toDisplayCount;
82 if (pageCount < toDisplayCount) end = pageCount;
83
84 //中间值
85 int centerNumber = toDisplayCount / 2;
86
87 if (pageCount > toDisplayCount)
88 {
89
90 //显示的第一位
91 int topNumber = currentPage - centerNumber;
92
93 if (topNumber > 1)
94 {
95 start = topNumber;
96 }
97
98 if (topNumber > pageCount - toDisplayCount)
99 {
100 start = pageCount - toDisplayCount + 1;
101 }
102
103 //显示的最后一位
104 int endNumber = currentPage + centerNumber;
105
106 if (currentPage >= pageCount - centerNumber)
107 {
108 end = pageCount;
109 }
110 else
111 {
112 if (endNumber > toDisplayCount)
113 {
114 end = endNumber;
115 }
116 }
117
118 }
119
120 StringBuilder sb = new StringBuilder();
121
122 //Previous
123 if (this.currentPage > 1)
124 {
125 sb.Append(GeneratePageLink("< Prev", this.currentPage - 1));
126 }
127
128 if (start > 1)
129 {
130 sb.Append(GeneratePageLink("1", 1));
131 sb.Append("...");
132 }
133
134 //end Previous
135
136 for (int i = start; i <= end; i++)
137 {
138 if (i == this.currentPage)
139 {
140 sb.AppendFormat("<span class=\"current\">{0}</span>", i);
141 }
142 else
143 {
144 sb.Append(GeneratePageLink(i.ToString(), i));
145 }
146 }
147
148 //Next
149 if (end < pageCount)
150 {
151 sb.Append("...");
152 sb.Append(GeneratePageLink(pageCount.ToString(), pageCount));
153 }
154
155 if (this.currentPage < pageCount)
156 {
157 sb.Append(GeneratePageLink("Next >", this.currentPage + 1));
158 }
159 //end Next
160
161 sb.Append("<span><input type=\"text\" class=\"pagerInput\" id=\"pagerInput\" maxlength=\"4\" onkeypress=\"return event.keyCode>=48&&event.keyCode<=57\"/></span>");
162 sb.Append("<span><input type=\"button\" value=\"跳转\" class=\"pagerButton\" onclick=\"if (!isNaN(parseInt(pagerInput.value))) window.location='" + this.pagelink.Replace("[%page%]", "") + "'+pagerInput.value;\"/></span>");
163
164 return sb.ToString();
165 }
166
167 /// <summary>
168 /// 生成Page的链接
169 /// </summary>
170 /// <param name="linkText">文字</param>
171 /// <param name="PageNumber">页码</param>
172 /// <returns></returns>
173 private string GeneratePageLink(string linkText, int PageNumber)
174 {
175
176 string linkFormat = string.Format("<a href=\"{0}\">{1}</a>", this.pagelink.Replace("[%page%]", PageNumber.ToString()), linkText);
177
178 return linkFormat;
179
180 }
181
182 #endregion
183 }
184 }
185
PageList封装Model代码:
1 namespace System.Web.Mvc
2 {
3 public class PageList<T>:List<T>
4 {
5 /// <summary>
6 /// 当前分页
7 /// </summary>
8 public int PageIndex { get; private set; }
9 /// <summary>
10 /// 显示数据条目
11 /// </summary>
12 public int PageSize { get; private set; }
13 /// <summary>
14 /// 总页数
15 /// </summary>
16 public int TotalCount { get; private set; }
17
18 public PageList(IEnumerable<T> source, int pageIndex, int pageSize, int totalCount)
19 {
20 PageIndex = pageIndex;
21
22 PageSize = pageSize;
23
24 TotalCount = totalCount;
25
26 AddRange(source);
27 }
28 }
29 }
2 {
3 public class PageList<T>:List<T>
4 {
5 /// <summary>
6 /// 当前分页
7 /// </summary>
8 public int PageIndex { get; private set; }
9 /// <summary>
10 /// 显示数据条目
11 /// </summary>
12 public int PageSize { get; private set; }
13 /// <summary>
14 /// 总页数
15 /// </summary>
16 public int TotalCount { get; private set; }
17
18 public PageList(IEnumerable<T> source, int pageIndex, int pageSize, int totalCount)
19 {
20 PageIndex = pageIndex;
21
22 PageSize = pageSize;
23
24 TotalCount = totalCount;
25
26 AddRange(source);
27 }
28 }
29 }
使用的时候,可自定义CSS,以下是我自用的CSS:
1 /* Pager */
2 .pager
3 {
4 font-size: 12px;
5 margin: 8px 0;
6 padding: 3px 0 3px;
7 text-align: left;
8 }
9
10 .pager .current
11 {
12 background-color: #06c;
13 border: 1px solid #009;
14 color: #fff;
15 font-weight: bold;
16 margin-top: 4px;
17 padding: 3px 5px;
18 text-align: center;
19 }
20
21 .pager a
22 {
23 margin: 4px 3px;
24 border: 1px solid #9AAFE5;
25 padding: 3px 5px;
26 text-align: center;
27 text-decoration: none;
28 color: #2E6AB1;
29 }
30
31 .pager .pagerInput
32 {
33 padding: 3px 0 0 0;
34 border: 1px solid #9AAFE5;
35 text-align: center;
36 text-decoration: none;
37 height: 16px;
38 width: 30px;
39 }
40 .pager .pagerButton
41 {
42 border: 1px solid #9AAFE5;
43 cursor: pointer;
44 }
2 .pager
3 {
4 font-size: 12px;
5 margin: 8px 0;
6 padding: 3px 0 3px;
7 text-align: left;
8 }
9
10 .pager .current
11 {
12 background-color: #06c;
13 border: 1px solid #009;
14 color: #fff;
15 font-weight: bold;
16 margin-top: 4px;
17 padding: 3px 5px;
18 text-align: center;
19 }
20
21 .pager a
22 {
23 margin: 4px 3px;
24 border: 1px solid #9AAFE5;
25 padding: 3px 5px;
26 text-align: center;
27 text-decoration: none;
28 color: #2E6AB1;
29 }
30
31 .pager .pagerInput
32 {
33 padding: 3px 0 0 0;
34 border: 1px solid #9AAFE5;
35 text-align: center;
36 text-decoration: none;
37 height: 16px;
38 width: 30px;
39 }
40 .pager .pagerButton
41 {
42 border: 1px solid #9AAFE5;
43 cursor: pointer;
44 }
ASP.NET MVC中使用方法如下:
Controller Action
1 /// <summary>
2 /// 获取角色列表
3 /// </summary>
4 /// <returns></returns>
5 private List<RBAC_Role> RoleList(int? page)
6 {
7 if (!page.HasValue)
8 {
9 page = 1;
10 }
11 int total = 0;
12 int pageSize = 2;
13
14 //获得角色数据列表
15 List<RBAC_Role> roleItems = Bll.GetPageData(page.Value,pageSize,ref total);
16
17 return roleItems.ToPageList(page.Value, pageSize, total);
18 }
2 /// 获取角色列表
3 /// </summary>
4 /// <returns></returns>
5 private List<RBAC_Role> RoleList(int? page)
6 {
7 if (!page.HasValue)
8 {
9 page = 1;
10 }
11 int total = 0;
12 int pageSize = 2;
13
14 //获得角色数据列表
15 List<RBAC_Role> roleItems = Bll.GetPageData(page.Value,pageSize,ref total);
16
17 return roleItems.ToPageList(page.Value, pageSize, total);
18 }
现在在View里面的头部加上Model类型并只需要如下调用:
1 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<PageList<Entity.RBAC_Role>>" %>
<div class="pager">
<%= Html.Pager(Model.PageIndex,Model.PageSize,Model.TotalCount) %>
</div>
<%= Html.Pager(Model.PageIndex,Model.PageSize,Model.TotalCount) %>
</div>
这样使用起来是非常方便的!欢迎大家使用