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 }

 

 输出显示代码: 

  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("&lt; 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 &gt;"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 { getprivate set; }
 9         /// <summary>
10         /// 显示数据条目
11         /// </summary>
12         public int PageSize { getprivate set; }
13         /// <summary>
14         /// 总页数
15         /// </summary>
16         public int TotalCount { getprivate 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 }

 

 

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 }

 

 

现在在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>  

 

这样使用起来是非常方便的!欢迎大家使用

posted @ 2010-01-12 23:59  0x001  阅读(1251)  评论(0)    收藏  举报