在 asp.net mvc中的简单分页算法


//第一步:建立如下分页实体类:
namespace MVCPager.Helpers
{
/// <summary>
/// 简单分页算法类
/// </summary>
public class Pager
{
public int RecordCount { get; set; }

public int PageIndex { get; set; }

public int PageSize { get; set; }

public int PageCount
{
get
{
return (RecordCount - 1) / PageSize + 1;
}
}

const int SHOW_COUNT = 6; //这个常量表示两边都有省略号时,中间的分页链接的个数,如 1..4 5 6 7 8 9 .. 100
private List<int> CalcPages()
{
List<int> pages = new List<int>();

int start = (PageIndex - 1) / SHOW_COUNT * SHOW_COUNT + 1;
int end = Math.Min(PageCount, start + SHOW_COUNT - 1);

if (start == 1)
{
end = Math.Min(PageCount, end + 1);
}
else if (end == PageCount)
{
start = Math.Max(1, end - SHOW_COUNT);
}
pages.AddRange(Enumerable.Range(start, end - start + 1));

if (start == PageIndex && start > 2)
{
pages.Insert(0, start - 1);
pages.RemoveAt(pages.Count - 1);//保持显示页号个数统一
}
if (end == PageIndex && end + 1 < PageCount)
{
pages.Add(end + 1);
pages.RemoveAt(0); //保持显示页号个数统一
}
if (PageCount > 1)
{
if (pages[0] > 1)
{
pages.Insert(0, 1); //如果页列表第一项不是第一页,则在队头添加第一页
}
if (pages[1] == 3)
{
pages.Insert(1, 2); //如果是1..3这种情况,则把..换成2
}
else if (pages[1] > 3)
{
pages.Insert(1, -1); //插入左侧省略号
}

if (pages.Last() == PageCount - 2)
{
pages.Add(PageCount - 1); //如果是 98..100这种情况,则..换成99
}
else if (pages.Last() < PageCount - 2)
{
pages.Add(-1); //插入右侧省略号
}

if (pages.Last() < PageCount)
{
pages.Add(PageCount); //最后一页
}
}

return pages;
}

/// <summary>
/// 用于显示的页号数组,如果中间有小于0的页号,则表示是省略号
/// </summary>
public List<int> Pages
{
get
{
return CalcPages();
}
}
}
}

第二步:建立一个cshtml分部页在Views/Shared中,命名为Pager.cshtml


@using MVCPager.Helpers;
@{
Layout = null;
var _id = ViewContext.RouteData.Values["id"];
var _action = ViewContext.RouteData.Values["action"].ToString();

Pager _pager = ViewBag.Pager as Pager;
}

<div style="text-align:right">
<ul class="pagination">
@if (_pager.PageIndex == 1)
{

<li><a href="###">&laquo;</a></li>
}
else
{
<li>
@Html.ActionLink("?", _action, new { id = _id, page = _pager.PageIndex - 1 })
</li>
}
@foreach (int p in _pager.Pages)
{
if (p < 0)
{
<li><a>- - -</a></li>
}
else if (p == _pager.PageIndex)
{
<li class="active">
<a href="#">@p</a>
</li>
}
else
{
<li>@Html.ActionLink(p.ToString(), _action, new { id = _id, page = p })</li>
}
}
@if (_pager.PageIndex == _pager.PageCount)
{
<li><a href="###">&raquo;</a></li>
}
else
{
<li>
@Html.ActionLink("?", _action, new { id = _id, page = _pager.PageIndex + 1 })
</li>
}
</ul>
</div>

以上操作完成后,就形成了一个可反复重用的分页组件。

调用方法:
第一步:在控制器中:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

var articles = (id == null
|| id == 0) ? _db.Articles : _db.Articles.Where(art => art.CatalogId == id);

var recordCount = articles.Count();

articles = articles.OrderByDescending(art => art.EditTime)

   .Skip((page.Value - 1) * PAGE_SZ)

   .Take(PAGE_SZ);

ViewBag.Pager = new
Pager()

{

    PageIndex = page.Value,

    PageSize = PAGE_SZ,

    RecordCount = recordCount,

};

return
View(articles);

第二步:在视图中(最后一行):


<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.Editor.UserName)
</th>
<th>
@Html.DisplayNameFor(model => model.EditTime)
</th>
<th>
@Html.DisplayNameFor(model => model.Catalog.Name)
</th>
<th></th>
</tr>

@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Editor.UserName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EditTime)
</td>
<td>
@Html.DisplayFor(modelItem => item.Catalog.Name)
</td>
<td>
@Html.ActionLink("编辑", "Edit", new { id=item.Id }) |
@Html.ActionLink("查看", "Details", new { id=item.Id }) |
@Html.ActionLink("删除", "Delete", new { id=item.Id })
</td>
</tr>
}

</table>
@Html.Partial("Pager")

自我评价:调用还算简单。能满足1...5 6 7 8 9 10 ... 100 这样的分页样式。

效果:

在 asp.net mvc中的简单分页算法,布布扣,bubuko.com

时间: 2024-10-12 21:00:36

在 asp.net mvc中的简单分页算法的相关文章

ASP.NET MVC中简单使用Autofac

项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control.控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度. 示例代码: IProvinceRepository.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Libing.Portal.Web.Models { public i

Asp.Net MVC中使用ACE模板之Jqgrid

第一次看到ACE模板,有种感动,有种相见恨晚的感觉,于是迅速来研究.它本身是基于bootstrap和jqueryui,但更nice,整合之后为后台开发节省了大量时间. 发现虽然不是完美,整体效果还是不错,特此分享给园友.这一节先讲其中的Jqgrid.按照国际惯例,先上两张图. 集成了button,form,treeview以及日历,时间轴.chart等控件,非常丰富.下面是Jqgrid在MVC中的使用. jqgrid的加载,排序,查找都是基于后台方法,不是在内存中完成,但也有一些小坑.下面一一道

ASP.NET MVC中使用异步控制器

线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个版本,才能趋于规范. ASP.NET MVC 中为什么需要使用异步呢,IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的情况下,池中的线程已经不能够满足这么多的请求时候,池中的每一个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,并且该

ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也没什么大的差别. 在ASP.NET应用程序里使用ASP.NET AJAX访问WebService通常都是通过ScriptMananger引入WebService生成客户端代理的方法,同时也可以使用Microsoft Ajax Library来完成.本文将介绍在ASP.NET MVC中使用ASP.NE

Asp.Net MVC中DropDownListFor的用法(转)

2016.03.04 扩展:如果 view中传入的是List<T>类型 怎么使用 DropList 既然是List<T> 那么我转化成 T  List<T>的第一个,最后一个不就是M吗? @Html.DropDownListFor(model=>model.First().Title, ViewData["Title"] as List<SelectListItem>, "标题", @"dropdown

ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败

在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加在Model里面.) 第一步:引用下面这个命名空间 第二步:添加验证 第三步:启动调试,出现以下问题: 解决方法: 超链接中包含了解决这个问题的详细介绍,也就是通过Code First数据库迁移的方式让Entity Framework帮助我们自动调整数据库里面的架构. 解决这个问题最简单的方法就是将

NPOI以及在ASP.NET MVC中的使用

NPOI以及在ASP.NET MVC中的使用 1.前言 相信大家在工作中经常要遇到一些导入导出Execl操作.学习贵在分享,分享使人快乐,园子里的前辈已经有很多好的文章,鄙人也是能力有限,在这里把这些好的文章总结,方便以后再工作中使用. NPOI:是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作. 它不使用Off

ASP.NET MVC中实现多个button提交的几种方法

有时候会遇到这样的情况:在一个表单上须要多个button来完毕不同的功能,比方一个简单的审批功能. 假设是用webform那不须要讨论,但asp.net mvc中一个表单仅仅能提交到一个Action处理,相对照较麻烦点. 方法一:使用client脚本 比方我们在View中这样写: <inputtype="submit"value="审核通过"onclick='this.form.action="<%=Url.Action("Actio

【MVC】ASP.NET MVC中实现多个按钮提交的几种方法

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 使用客户端脚本 <input type="submit" value="审核通过" onclick='this.form.action="<%=Url.Action("Action1") %>";' /