艾伟_转载:一个MVC分页Helper

  本人写的一个分页Helper,支持普通分页(也就是,首页、上一页、下一页、末页等),综合分页(普通分页和数字分页的综合)。下面是分页效果:

分页代码:

PagerHelper.cs

代码

  1 using System;
  2  using System.Collections.Generic;
  3 using System.Collections.Specialized;
  4 using System.Linq;
  5 using System.Web;
  6 using System.Text;
  7 using System.Web.Mvc;
  8 using System.Web.Routing;
  9 using System.Data.Objects.DataClasses;
 10 namespace System.Web.Mvc
 11 {
 12     public static class PagerHelper
 13     {
 14         /// 
 15         /// 分页
 16         /// 
 17         /// 
 18         /// 分页id
 19         /// 当前页
 20         /// 分页尺寸
 21         /// 记录总数
 22         /// 分页头标签属性
 23         /// 分页样式
 24         /// 分页模式
 25         /// 
 26         public static string Pager(this HtmlHelper helper, string id, int currentPageIndex, int pageSize, int recordCount, object htmlAttributes, string className,PageMode mode)
 27         {
 28             TagBuilder builder = new TagBuilder("table");
 29             builder.IdAttributeDotReplacement = "_";
 30             builder.GenerateId(id);
 31             builder.AddCssClass(className);
 32             builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
 33             builder.InnerHtml = GetNormalPage(currentPageIndex, pageSize, recordCount,mode);
 34             return builder.ToString();
 35         }
 36         /// 
 37         /// 分页
 38         /// 
 39         /// 
 40         /// 分页id
 41         /// 当前页
 42         /// 分页尺寸
 43         /// 记录总数
 44         /// 分页样式
 45         /// 
 46         public static string Pager(this HtmlHelper helper, string id, int currentPageIndex, int pageSize, int recordCount, string className)
 47         {
 48             return Pager(helper, id, currentPageIndex, pageSize, recordCount, null, className,PageMode.Normal);
 49         }
 50         /// 
 51         /// 分页
 52         /// 
 53         /// 
 54         /// 分页id
 55         /// 当前页
 56         /// 分页尺寸
 57         /// 记录总数
 58         /// 
 59         public static string Pager(this HtmlHelper helper,string id,int currentPageIndex,int pageSize,int recordCount)
 60         {
 61             return Pager(helper, id, currentPageIndex, pageSize, recordCount,null);
 62         }
 63         /// 
 64         /// 分页
 65         /// 
 66         /// 
 67         /// 分页id
 68         /// 当前页
 69         /// 分页尺寸
 70         /// 记录总数
 71         /// 分页模式
 72         /// 
 73         public static string Pager(this HtmlHelper helper, string id, int currentPageIndex, int pageSize, int recordCount,PageMode mode)
 74         {
 75             return Pager(helper, id, currentPageIndex, pageSize, recordCount, null,mode);
 76         }
 77         /// 
 78         /// 分页
 79         /// 
 80         /// 
 81         /// 分页id
 82         /// 当前页
 83         /// 分页尺寸
 84         /// 记录总数
 85         /// 分页样式
 86         /// 分页模式
 87         /// 
 88         public static string Pager(this HtmlHelper helper, string id, int currentPageIndex, int pageSize, int recordCount,string className, PageMode mode)
 89         {
 90             return Pager(helper, id, currentPageIndex, pageSize, recordCount, null,className,mode);
 91         }
 92         /// 
 93         /// 获取普通分页
 94         /// 
 95         /// 
 96         /// 
 97         /// 
 98         /// 
 99         private static string GetNormalPage(int currentPageIndex, int pageSize, int recordCount,PageMode mode)
100         {
101             int pageCount = (recordCount%pageSize ==0?recordCount/pageSize:recordCount/pageSize+1);
102             StringBuilder url = new StringBuilder();
103             url.Append(HttpContext.Current.Request.Url.AbsolutePath+"?page={0}");
104             NameValueCollection collection = HttpContext.Current.Request.QueryString;
105             string[] keys = collection.AllKeys;
106             for (int i = 0; i < keys.Length; i++)
107             {
108                 if (keys[i].ToLower() != "page")
109                     url.AppendFormat("&{0}={1}", keys[i], collection[keys[i]]);
110             }
111             StringBuilder sb = new StringBuilder();
112             sb.Append("");
113             sb.AppendFormat("总共{0}条记录,共{1}页,当前第{2}页  ", recordCount, pageCount, currentPageIndex);
114             if (currentPageIndex == 1)
115                 sb.Append("首页 ");
116             else
117             {
118                 string url1 = string.Format(url.ToString(), 1);
119                 sb.AppendFormat("首页 ", url1);
120             }
121             if (currentPageIndex > 1)
122             {
123                 string url1 = string.Format(url.ToString(), currentPageIndex - 1);
124                 sb.AppendFormat("上一页 ", url1);
125             }
126             else
127                 sb.Append("上一页 ");
128             if(mode == PageMode.Numeric)
129                 sb.Append(GetNumericPage(currentPageIndex,pageSize,recordCount,pageCount,url.ToString()));
130             if (currentPageIndex < pageCount)
131             {
132                 string url1 = string.Format(url.ToString(), currentPageIndex+1);
133                 sb.AppendFormat("下一页 ", url1);
134             }
135             else
136                 sb.Append("下一页 ");
137 
138             if (currentPageIndex == pageCount)
139                 sb.Append("末页 ");
140             else
141             {
142                 string url1 = string.Format(url.ToString(), pageCount);
143                 sb.AppendFormat("末页 ", url1);
144             }
145             return sb.ToString();
146         }
147         /// 
148         /// 获取数字分页
149         /// 
150         /// 
151         /// 
152         /// 
153         /// 
154         /// 
155         /// 
156         private static string GetNumericPage(int currentPageIndex, int pageSize, int recordCount, int pageCount,string url)
157         {
158             int k = currentPageIndex / 10;
159             int m = currentPageIndex % 10;
160             StringBuilder sb = new StringBuilder();
161             if (currentPageIndex / 10 == pageCount / 10)
162             {
163                 if (m == 0)
164                 {
165                     k--;
166                     m = 10;
167                 }
168                 else
169                     m = pageCount%10;
170             }
171             else
172                 m = 10;
173             for (int i = k * 10 + 1; i <= k * 10 + m; i++)
174             {
175                 if (i == currentPageIndex)
176                     sb.AppendFormat("{0} ", i);
177                 else
178                 {
179                     string url1 = string.Format(url.ToString(), i);
180                     sb.AppendFormat("{1} ",url1, i);
181                 }
182             }
183             
184             return sb.ToString();
185         }
186     }
187     /// 
188     /// 分页模式
189     /// 
190     public enum PageMode
191     {
192         /// 
193         /// 普通分页模式
194         /// 
195         Normal,
196         /// 
197         /// 普通分页加数字分页
198         /// 
199         Numeric
200     }
201 }
202 

PagerQuery.cs包含两个属性,一个是PageInfo实体类属性Pager,包含RecordCount,CurrentPageIndex,PageSize三个属性。一个是Model EntityList属性。

代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 namespace System.Web.Mvc
 7 {
 8     public class PagerQuery<TPager,TEntityList>
 9     {
10         public PagerQuery(TPager pager, TEntityList entityList)
11         {
12             this.Pager = pager;
13             this.EntityList = entityList;
14         }
15         public TPager Pager { get; set; }
16         public TEntityList EntityList { get; set; } 
17     }
18 }

PageInfo.cs

代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 namespace System.Web.Mvc
 7 {
 8     public class PagerInfo
 9     {
10         public int RecordCount { get; set; }
11 
12         public int CurrentPageIndex { get; set; }
13 
14         public int PageSize { get; set; }
15     }
16 }

使用示例:

代码

@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage>>" %>

asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    NewsList
asp:Content>

asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    h2>NewsListh2>

    table>
        tr>
            th>th>
            th>
                NoteID
            th>
            th>
                Title
            th>
            th>
                Author
            th>
            th>
                Hit
            th>
            th>
                ReplyNum
            th>
            
        tr>

     foreach (var item in Model.EntityList) { %>
    
        tr>
            td>
                 Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) %> |
                 Html.ActionLink("Details", "NewsDetail", new { noteID=item.NoteID })%>
            td>
            td>
                 Html.Encode(item.NoteID) %>
            td>
            td>
                 Html.Encode(item.Title) %>
            td>
            td>
                 Html.Encode(item.Author)%>
            td>
            td>
                 Html.Encode(item.Hit)%>
            td>
            td>
                 Html.Encode(item.ReplyNum)%>
            td>
            
        tr>
    
     } %>

    table>

    p>
        Html.Pager("pager",Model.Pager.CurrentPageIndex,Model.Pager.PageSize,Model.Pager.RecordCount,PageMode.Numeric) %>
    p>

asp:Content>

 controler:

代码

 1         [AcceptVerbs(HttpVerbs.Get)]
 2         public ActionResult NewsList(int boardID,int? page)
 3         {
 4             PagerInfo pager = new PagerInfo();
 5             NewsArticleInfo info = new NewsArticleInfo();
 6             info.NewsBoard = new NewsBoardInfo();
 7             info.NewsBoard.BoardID = boardID;
 8             pager.RecordCount = Resolve<INewsBLL>().GetArticleDataList(info, ArticleTypeEnum.Pass);
 9             pager.PageSize = 10;
10             pager.CurrentPageIndex = (page!=null?(int)page:1);
11             IList<NewsArticleInfo> result = Resolve<INewsBLL>().GetArticleDataList(pager.CurrentPageIndex, pager.PageSize, ArticleTypeEnum.Pass, info);
12             PagerQuery<PagerInfo, IList<NewsArticleInfo>> query = new PagerQuery<PagerInfo, IList<NewsArticleInfo>>(pager,result);
13             return View(query);
14         }

 

时间: 2024-09-23 14:36:45

艾伟_转载:一个MVC分页Helper的相关文章

一个MVC分页Helper

本人写的一个分页Helper,支持普通分页(也就是,首页.上一页.下一页.末页等),综合分页(普通分页和数字分页的综合).下面是分页效果: 分页代码: PagerHelper.cs 代码  1 using System;   2  using System. Collections.Generic;   3 using System.Collections.Specialized;   4 using System.Linq;   5 using System.Web;   6 using Sy

一起谈.NET技术,一个MVC分页Helper

本人写的一个分页Helper,支持普通分页(也就是,首页.上一页.下一页.末页等),综合分页(普通分页和数字分页的综合).下面是分页效果: 分页代码: PagerHelper.cs 代码   1 using System;  2  using System.Collections.Generic;  3 using System.Collections.Specialized;  4 using System.Linq;  5 using System.Web;  6 using System.

艾伟_转载:MVC和MVP的一些思考

这篇文章是我近期对MVC和MVP的一些思考,在使用MVC/MVP模式的过程中曾经走过一些弯路.呵呵,现在虽然改正了某些弯路,但不保证改正了所有的弯路(例如对渲染的理解),所以请阅读这篇文章的朋友不吝发挥你们的质疑. 写这篇文章也是想知道自己还有什么地方是错的,我的最终方案是否可行? 有交流才会有进步.你有一个苹果,我有一个苹果,我们交换后仍各有一个苹果,你有一个思想,我有一个思想,我们交换后......会有N个思想 :p 1. MVC的理解误区 以下是我以前对MVC模式的理解误区: 1. 认为M

艾伟_转载:WinForm界面开发之酒店管理系统--开篇

星移斗转,时光似箭,不知不觉中,酒店管理系统的开发从开始到现在的结束,已经2个月了,2个月的业余时间,2个月的生活情趣,都寄托在这个软件当中,经历了各种艰苦和困惑,终于得以修成正果---深田之星酒店管理系统的顺利发布. 技术的历程是一个开拓进取.攻克难题的历程,其中有困惑也有兴奋,有苦涩也有甜蜜, 在这个过程中,再一次检阅了我的Database2Sharp代码自动生成的开发工具的,再一次从"深田之星送水管理系统"进行升华,技术从来没有尽头,只有不断完善,以及不断的超越和创新.在这个过程

艾伟_转载:ASP.NET MVC分页的实现

在ASP.NET中,GridView控件本身就带有分页的功能,只要把当前页面的索引值赋给GridView的PageIndex就可以实现了分页,至于数据怎么分页,全都由GridView封装起来了. 在ASP.NET MVC中分页的实现就只能靠自己来设计了.首先来说一下分页的原理.现在有一个张news表,中间有很多信息,我们假设一页显示5条记录,这样,页面数量=总记录数/5:这里,如果出现小数,得进位取整.如比总记录和数为51,那么分的页面数量是11,最后一页只有一条记录.好,有这样一个思路后,现在

艾伟_转载:学习 ASP.NET MVC (第五回)理论篇

本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回)实战篇 学习 ASP.NET MVC (第五回)理论篇 通过前几篇文章,我们通过ASP.NET MVC创建了一个简单的应用程序,学习了ASP.NET MVC的基本框架和工作流程.但是Demo中很多东西都是VS为我们自动生成的,比如View的html代码等.此文和大家一起学习一下ASP.NET MVC

艾伟_转载:ASP.NET MVC 2博客系列

过去的6个月里,ASP.NET开发团队一直不断地发布了ASP.NET MVC 2的预览版,然后是beta版,现在则是RC(最终版的候选版). 鉴于最终版的发布也不太远了,我想该是开始一个含多个部分的ASP.NET MVC 2 新博客系列的时候了,该系列旨在讨论新的特性以及该如何充分利用它们. ASP.NET MVC 2 去年三月份时,我们发布了ASP.NET MVC 1.0.自那以后,几乎有一百万开发人员下载和使用了1.0的最终版,它的人气(popularity)逐月递增. ASP.NET MV

艾伟_转载:[一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? MVC时代来临了,但是一开始是不被很多人接受的.可能

艾伟_转载:[一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? 对HtmlHelper进行扩展,是MVC中对于Vie