在开发项目中,写了一个分页实现的例子,现在把源代码贴上,以供以后写代码时参考

在列表的头部,有如下显示,

这个代表一个页面显示10条记录,总共22条记录。

这个是页面底部的显示

那么如何来显示这个分页效果,如何来写一个泛型的通用的分页类实现分页效果呢

 第1个类 Paging.cs

这个类包括分页需要的一些变量,包括 页面数PageCount, 上面图片中Previous,Next是否显示, 以及Previous 和 Next对应的链接URL, 以及组成URL的各部分

using System;
using System.Collection.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web; public class Paging
{
public string PrependStr = string.Empty;
public string UrlPart;
public string NextHrefUrl = "";
public string PrevHrefUrl = "";
public bool IsPreviousVisible = false;
public bool IsNextVisible = false; private int _pageCount;
private string _summary; public int[] Numbers {get; set;}
public int PageSize {get; set;} public int PageNo
{
get
{
int pageNo = ;
if(HttpContext.Current.Request["page"] != null && !String.IsNullOrEmpty(HttpContext.Current.Request["page"]))
{
Int32.TryParse(HttpContext.Current.Request["page"], out pageNo);
}
return pageNo; } } public void BindPaging(string urlPart, int recordCount, int pageSize, string prependStr, string summary)
{ _pageCount = (int)Math.Ceiling((decimal)recordCount / pageSize);
UrlPart = urlPart.Split('?')[];
_summary = summary;
PrependStr = prependStr; Numbers = new int[_pageCount];
for(int i = ; i <= _pageCount; i++)
Numbers[i-] = i; PrepagePaging(); } protected void PreparePaging()
{
if(PageNo == )
IsPreviousVisible = false; if (PageNo == && _pageCount == )
{
IsPreviousVisible = false;
IsNextVisible = false; }
else if (PageNo == && PageNo < _pageCount)
{
IsPreviousVisible = false;
IsNextVisible = true;
NextHrefUrl = UrlPart + "?page=" + (PageNo + ).ToString() + PrependStr;
}
else if (PageNo > && PageNo < _pageCount)
{
IsPreviousVisible = true;
PrevHrefUrl = UrlPart + "?page=" + (PageNo - ).ToString() + PrependStr;
IsNextVisible = true;
NextHrefUrl = UrlPart + "?page=" + (PageNo + ).ToString() + PrependStr;
}
else if (PageNo == _pageCount)
{
IsPreviousVisible = true;
PrevHrefUrl = UrlPart + "?page=" + (PageNo - ).ToString() + PrependStr;
IsNextVisible = false;
} } }

上面这个类是分页需要的类,我们当然还需要一个类,来实现分页中的实际页面,也就是PagedResult, 但是因为我们并不知道页面中的具体内容,我们是要做一个通用的例子,所以,使用泛型来实现

 第2个类 PagedResult.cs

我们来看看这个类, 我们先定义一个泛型接口 IPagedResult<T>

public interface IPagedResult<T>
{
ICollection<T> Result {get;} int Total {get;}
int CurrentPage {get; set;}
int PageCount {get; set;}
int PageSize {get; set;}
int RowCount {get; set;} bool IsEmpty {get;} void Add(T entity); string GetCurrentPageRangeString(); }

接下来我们再定义一个泛型类PagedResult<T>,来继承这个泛型接口

public class PagedResult<T> : IPagedResult<T>
{
private readonly Collection<T> _result;
private readonly int _total; //依赖注入 构造函数
public PagedResult(IEnumerable<T> result, int total)
{
_result = new Collection<T>(new List<T>(result)); // 这里也是一个小知识点,可以通过new List(IEnumerable) 把IEnumerable类型转为List类型
_total = total; } public PagedResult() : this(new List<T>(),)
{ } public int CurrentPage {get; set;} public bool IsEmpty
{ get
{
return _result.Count == ;
}
} public int PageCount {get; set;}
public int PageSize {get; set;} public ICollection<T> Result
{
get
{
return _result;
}
} public int RowCount {get; set;} public int Total
{
get
{
return _total;
}
} public void Add(T entity)
{
_result.Add(entity);
} public string GetCurrentPageRangeText()
{
CurrentPage = CurrentPage == ? : CurrentPage;
var start = PageSize * (CurrentPage - ) + ;
var end = CurrentPage * PageSize <= Total ? start + PageSize - : Total;
if(Total == )
return "No results found"; string resultsOf = "results of";
string showing = "Showing"; return string.Format("{0} {1} - {2} {3} {4}", showing, start, end, resultsOf, Total); } }

我们还需要一个类,是根据类的结果列表来获取它的页结果列表PagedResult, 这是一个帮助类. 我们给它取名为PaginationHelper.cs

public static class PaginationHelper
{ public static int TotalPage(int total, int rowPerPage)
{
if((total == ) || (rowPerPage == ))
{
return ;
} if((total % rowPerPage) == )
{
return total / rowPerPage; } double result = Convert.ToDouble(total / rowPerPage); result = Math.Ceiling(result); return Convert.ToInt32(result) + ; } public static int StartIndex(int? page, int rowPerPage)
{
return (page.HasValue && (page.Value > )) ? ((page.Value -) * rowPerPage) : ; } public static PagedResult<T> GetPagedResultSet<T>(IEnumerable<T> resultSet, int pageSize, int? currentPage)
{
if(resultSet == null)
return new PagedResult<T>();
var result = new List<T>(resultSet); //这个是把IEnumerable转换为List的方法
var resultCount = result.Count; var startIndex = StartIndex(currentPage, pageSize);
var results = result.Skip(startIndex).Take(pageSize); // 这里放的是当前这个页面的结果列表,因为我们在View中需要列出当前那页的结果列表
var pageTotals = TotalPage(resultCount,pageSize); if(currentPage.HasValue && currentPage > pageTotals)
currentPage = null; var pageResultSet = new PagedResult<T>(results,resultCount)
{
CurrentPage = currentPage.HasValue ? currentPage.Value : ,
PageCount = pageTotals,
PageSize = pageSize }; return pagedResultSet; } public static PagedResult<T> GetPagedResult<T>(Func<IEnumerable<T>> func, int pageSize, int? currentPageIndex) where T : class
{
return GetPagedResultSet(func(), pageSize, currentPageIndex); }

现在我们开始写这个View

写这个图显示的View, 它用的Model 就是上面的Paging.cs, 我们可以看到,这个类Paging.cs没有关注分页的内容是什么,也就是它拥有完全的通用性,无论分页中的内容具体是什么,都可以使用这个来实现这个图示例的分页,那我们现在来看看这个View是怎么写的

Paging.cshtml

@inherits UmbracoViewPage<Paging>

@if (Model.Numbers.Length > )
{ <div class="row">
<div class="col-md-6">
<div class="pagination-page">
<ul>
@if (Model.IsPreviousVisible)
{
<li>
<a href="@Model.PrevHref">Previous</a>
</li>
}
@foreach (var number in Model.Numbers)
{
var urlHref = Model.UrlPart + "?page=" + (number).ToString() + Model.PrependStr;
<li class="@(number == Model.PageNo ? "active" : string.Empty)">
<a href="@urlHref">@number</a>
</li>
}
@if (Model.IsNextVisible)
{
<li>
<a href="@Model.NextHref">Next</a>
</li>
}
</ul>
</div>
</div>
</div>
}

这里面还有一些css 我就不贴在这里了,CSS及格式可以自己设置调整

接下来我们就来看看分页内容的实现,也就是说每一页中的内容的实现

我们举个例子,这个列表是News的列表,每页显示10条News,每一条News上的title上是一个链接,点击这个链接会打开一个新的页面(有这个news的URL去链接到另一个页面)来显示这个news的全部内容

显示每页News内容的页面,所使用的Model是NewsSearchResult, 具体如下

NewsSearchResult.cs

public class NewsSearchResult
{ public NewsSearchResult()
{ } public int? PageNo {get; set;} public IPagedResult<NewsResult> NewsResults {get; set;} public Paging Paging {get; set;} }

可以看到,它这里用到了我们上面定义的Paging类,已经接口IPagedResult<T>, 里面又有一个类NewsResult, 定义的是每一个News所包含的一些基本属性(title, url等), 我们来看看它的定义

NewsResult.cs

public class NewsResult
{ public string NewsTitle {get; set;} public string NewsDesc {get; set;} public string NewsDate {get; set;} public string PageUrl {get; set;} }

定义好了model后,我们来看看MVC中的Controller的实现,我们取名为SearchController.cs

SearchController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; public class SearchController : Controller
{ public ActionResult Render()
{
return View("NewsListSearch.cshtml", BuildInitialModel()); } public NewsSearchResult BuildInitialModel()
{
NewsSearchResult model = new NewsSearchResult();
model.PageNo = !string.IsNullOrEmpty(Request["page"]) ? Int32.Parse(Request["page"]) : ;
List<NewsResult> newsResults = GetAllNewsList();
Paging paging = new Paging();
IPagedResult<NewsResult> pagedResultSet = null;
pagedResultSet = PaginationHelper.GetPagedResultSet(newsResults,,paging.PageNo); //每页面显示10条结果
paging.BindPaging(Request.RawUrl, pagedResultSet.Total,,string.Empty,string.Empty);
model.Paging = paging;
model.NewsResults = pagedResultSet;
return model; } private List<NewsResult> GetAllNewsList()
{
List<NewsResult> allNewsResults = new List<NewsResult>{ new NewsResult {NewsTitle = "News 1", NewsDesc = "This is the description for News 1", NewsDate = "2017-01", PageUrl = "www.ournews.com/list/news1"},
new NewsResult {NewsTitle = "News 2", NewsDesc = "This is the description for News 2", NewsDate = "2017-02", PageUrl = "www.ournews.com/list/news2"},
new NewsResult {NewsTitle = "News 3", NewsDesc = "This is the description for News 3", NewsDate = "2017-03", PageUrl = "www.ournews.com/list/news3"},
new NewsResult {NewsTitle = "News 4", NewsDesc = "This is the description for News 4", NewsDate = "2017-04", PageUrl = "www.ournews.com/list/news4"},
new NewsResult {NewsTitle = "News 5", NewsDesc = "This is the description for News 5", NewsDate = "2017-05", PageUrl = "www.ournews.com/list/news5"},
new NewsResult {NewsTitle = "News 6", NewsDesc = "This is the description for News 6", NewsDate = "2017-06", PageUrl = "www.ournews.com/list/news6"},
new NewsResult {NewsTitle = "News 7", NewsDesc = "This is the description for News 7", NewsDate = "2017-07", PageUrl = "www.ournews.com/list/news7"},
new NewsResult {NewsTitle = "News 8", NewsDesc = "This is the description for News 8", NewsDate = "2017-08", PageUrl = "www.ournews.com/list/news8"},
new NewsResult {NewsTitle = "News 9", NewsDesc = "This is the description for News 9", NewsDate = "2017-09", PageUrl = "www.ournews.com/list/news9"},
new NewsResult {NewsTitle = "News 10", NewsDesc = "This is the description for News 10", NewsDate = "2017-10", PageUrl = "www.ournews.com/list/news10"},
new NewsResult {NewsTitle = "News 11", NewsDesc = "This is the description for News 11", NewsDate = "2017-11", PageUrl = "www.ournews.com/list/news11"},
new NewsResult {NewsTitle = "News 12", NewsDesc = "This is the description for News 12", NewsDate = "2017-12", PageUrl = "www.ournews.com/list/news12"},
new NewsResult {NewsTitle = "News 13", NewsDesc = "This is the description for News 13", NewsDate = "2018-01", PageUrl = "www.ournews.com/list/news13"},
new NewsResult {NewsTitle = "News 14", NewsDesc = "This is the description for News 14", NewsDate = "2018-02", PageUrl = "www.ournews.com/list/news14"},
new NewsResult {NewsTitle = "News 15", NewsDesc = "This is the description for News 15", NewsDate = "2018-03", PageUrl = "www.ournews.com/list/news15"},
new NewsResult {NewsTitle = "News 16", NewsDesc = "This is the description for News 16", NewsDate = "2018-04", PageUrl = "www.ournews.com/list/news16"},
new NewsResult {NewsTitle = "News 17", NewsDesc = "This is the description for News 17", NewsDate = "2018-05", PageUrl = "www.ournews.com/list/news17"},
new NewsResult {NewsTitle = "News 18", NewsDesc = "This is the description for News 18", NewsDate = "2018-06", PageUrl = "www.ournews.com/list/news18"},
new NewsResult {NewsTitle = "News 19", NewsDesc = "This is the description for News 19", NewsDate = "2018-07", PageUrl = "www.ournews.com/list/news19"},
new NewsResult {NewsTitle = "News 20", NewsDesc = "This is the description for News 20", NewsDate = "2018-08", PageUrl = "www.ournews.com/list/news20"},
new NewsResult {NewsTitle = "News 21", NewsDesc = "This is the description for News 21", NewsDate = "2018-09", PageUrl = "www.ournews.com/list/news21"},
new NewsResult {NewsTitle = "News 22", NewsDesc = "This is the description for News 22", NewsDate = "2018-10", PageUrl = "www.ournews.com/list/news22"},
new NewsResult {NewsTitle = "News 23", NewsDesc = "This is the description for News 23", NewsDate = "2018-11", PageUrl = "www.ournews.com/list/news23"},
new NewsResult {NewsTitle = "News 24", NewsDesc = "This is the description for News 24", NewsDate = "2018-12", PageUrl = "www.ournews.com/list/news24"} } }
}

现在我们来看看这个展示结果页面的View, 也就是每一个页面实际显示的View  ===>   NewsList.cshtml

@inherits UmbracoViewPage<NewsSearchResult>
<div class="col-md-12">
<div class="support-item" style="padding-bottom:0px">
@foreach (var newsResult in Model.NewsResults.Result)
{
<a href="@newsResult.PageUrl">@newsResult.NewsTitle</a> <div>
<p class="small">@newsResult.NewsDesc</p>
<a href="@newsResult.PageUrl">
<span class="small">Read News ›</span>
</a>
</div>
</div>
</div> }
</div>
</div>

这上面的 Model.NewsResults.Result 里面是当前页面的那个10条News结果

最后,我们来看看页面顶部的 显示当前News记录顺序的View, 就是显示如下图示的View

我们给这个View取名为ShowingDesc.cshtml, 内容如下

@inherits UmbracoViewPage<NewsSearchResult>

<div class="col-md-6">
@if (Model.NewsResults.Total > )
{
<p class="pagination-result" style="text-align: left;">
<strong> @Model.NewsResults.GetCurrentPageRangeString() </strong> </p>
} </div>

到目前为止,页面的3部分都有了,分别是 ShowingDesc.cshtml, NewsList.cshtml,Paging.cshtml  我们把它们组成最后的显示页面 NewsListSearch.cshtml

@inherits Umbraco.Web.Mvc.UmbracoViewPage<NewsSearchResult>

<div class="col-md-12">

    @Html.Partial("ShowingDesc.cshtml", Model)
<hr />
</div> @Html.Partial("NewsList.cshtml", Model)
<div class="col-md-12">
@Html.Partial("Paging.cshtml", Model.Paging)
</div>

MVC项目中的分页实现例子的更多相关文章

  1. 转 mvc项目中,解决引用jquery文件后智能提示失效的办法

    mvc项目中,解决用Url.Content方法引用jquery文件后智能提示失效的办法   这个标题不知道要怎么写才好, 但是希望文章的内容对大家有帮助. 场景如下: 我们在用开发开发程序的时候,经常 ...

  2. 谈谈MVC项目中的缓存功能设计的相关问题

    本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...

  3. 在 ASP.NET MVC 项目中使用 WebForm、 HTML

    原文地址:http://www.cnblogs.com/snowdream/archive/2009/04/17/winforms-in-mvc.html ASP.NET MVC和WebForm各有各 ...

  4. MVC项目中如何判断用户是在用什么设备进行访问

    使用UAParser在C#MVC项目中如何判断用户是在用什么设备进行访问(手机,平板还是普通的电脑) 现在我们开发的很多web应用都要支持手机等移动设备.为了让手机用户能有更加好的用户体验,我们经常为 ...

  5. 在已有的Asp.net MVC项目中引入Taurus.MVC

    Taurus.MVC是一个优秀的框架,如果要应用到已有的Asp.net MVC项目中,需要修改一下. 1.前提约定: 走Taurus.MVC必须指定后缀.如.api 2.原项目修改如下: web.co ...

  6. ASP.NET MVC项目中App_Code目录在程序应用

    学习ASP.NET MVC,如果你是开发ASP.NET MVC项目的,也许你去为项目添加前ASP.NET项目的APP_Code目录,在这里创建与添加的Class类,也许你无法在MVC项目所引用. 那这 ...

  7. 如何在mvc项目中使用apiController

    文章地址:How do you route from an MVC project to an MVC ApiController in another project? 文章地址:How to Us ...

  8. 在ASP.NET MVC项目中使用极验验证(geetest)

    时间 2016-03-02 18:22:37 smallerpig 原文  http://www.smallerpig.com/979.html 主题 ASP.NET MVC   geetest开发体 ...

  9. spring MVC项目中,欢迎页首页根路径到底是怎么设置的

    0. 问题: 如何改mvc中项目的欢迎页,或者叫做根路径 一个东西快弄完了,就剩下一个问题,应该是个小问题.就是mvc项目的欢迎页,怎么给改下呢. 这个项目是通过mvn建立的,整个项目的原型就是spr ...

随机推荐

  1. css 行内元素 块元素 替换元素 非替换元素 以及这些元素的width height margin padding 特性

    一.各种元素的width height margin padding 特性(具体css元素的分来参看二) 1.块级元素 width. height. margin的四个方向. padding的四个方向 ...

  2. Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [applicationContext.xml]

    Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined ...

  3. 数据库+maven

    1.mysql <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  4. Python--基础文件读写操作

    1,open(),对文件进行读写操作之前,要先打开文件,获取文件的句柄: 懒人专用方法,文件打开后不用关闭 with open(r'somefile.txt','r+',encoding='utf8' ...

  5. Android之ExpandableList扩展用法(基于BaseExpandableListAdapter)

    1.简介 基于基于BaseExpandableListAdapter扩展的ExpandableList用法,现在网上流行的主要有两种:第一种是向BaseExpandableListAdapter传入两 ...

  6. D唐纳德和他的数学老师(华师网络赛)(二分匹配,最大流)

    Time limit per test: 1.0 seconds Memory limit: 256 megabytes 唐纳德是一个数学天才.有一天,他的数学老师决定为难一下他.他跟唐纳德说:「现在 ...

  7. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳

    题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...

  8. 使用Visual Studio进行单元测试-Shim类中无法找到参数包含CancellationTokenSource的方法

    Shim类中无法找到参数包含CancellationTokenSource的方法,这句话有点绕口,看例子. 一.代码 public class CancellationDemo { public in ...

  9. mysql root密码忘记重置

    1.修改/etc/my.cnf文件 找到mysqld选项,增加子项skip-grant-tables 2.重新启动mysql服务 service mysqld restart 3.进入mysql 在s ...

  10. spring IOC 注解@Autowired

    自动装配:按照类型来找 会在xml中找类型一样的, 比如 setMessage(SetName setName)上面有@Autowired,会到xml中找<bean id="setna ...