MVC快速分页
.NET手记-ASP.NET MVC快速分页的实现
对于Web应用,展示List是很常见的需求,随之而来的常见的分页组件。jQuery有现成的分页组件,网上也有着大量的第三方分页组件,都能够快速实现分页功能。但是今天我描述的是用基本的C#和html代码实现的分页,不借助任何第三方组件。
实现思路

这里的实现主要借助ViewModel和HtmlHelper实现,通过传递分页参数PagingInfo来实现。
创建分页参数类PagingInfo.cs

using System; namespace CWHomeWebSite.Models
{
public class PagingInfo
{
//项目总数量
public int TotalItems { get; set; }
//当前索引
public int PageIndex { get; set; }
//分页大小
public int PageSize { get; set; }
//页数
public int PageCount
{
get
{
return (int)Math.Ceiling((decimal)TotalItems / PageSize);
}
}
}
}

创建视图对应的ViewModel

using CWHomeWebSite.Data.Entities;
using System.Collections.Generic; namespace CWHomeWebSite.Models
{
public class PostViewModel
{
//博客集合
public IEnumerable<Post> Posts { get; set; }
//分页参数
public PagingInfo PagingInfo { get; set; }
}
}

处理Controller视图方法
这里我们视图对应的方法是Index,其中分页参数设定了默认值,这样即使不传递也会默认分页。this.repository是注入的DBContext对象,提供数据源。

public ActionResult Index(int pageIndex = 1, int pageSize = 2)
{
//获取当前分页数据集合
var posts = this.repository.Posts
.OrderBy(p=>p.UpdateTime)
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize); //将当前ViewModel传递给视图
return View(new PostViewModel
{
Posts = posts,
PagingInfo = new PagingInfo
{
TotalItems = this.repository.Posts.Count(),
PageIndex = pageIndex,
PageSize = pageSize
}
});
}

在View中通过Html辅助器扩展方法处理PagingInfo
利用上一篇文章讲述的扩展方法,为Html辅助器定义一个扩展方法用于生成分页html代码,实现如下:

using CWHomeWebSite.Models;
using System;
using System.Web.Mvc; namespace CWHomeWebSite.Helper
{
public static class PagingHelper
{
//HtmlHelper扩展方法,用于分页
public static MvcHtmlString Pagination(this HtmlHelper html, PagingInfo pageInfo,Func<PagingInfo,string> pageLinks)
{
var htmlString = pageLinks(pageInfo); return MvcHtmlString.Create(htmlString);
}
}
}

在视图中调用此扩展方法,处理逻辑通过Lamda表达式引用,这样可以修改View视图来调整并使用Url.Action来生成Url,而不用重新编译cs文件。完整的视图文件如下:

@model CWHomeWebSite.Models.PostViewModel
@using CWHomeWebSite.Helper @{
ViewBag.Title = "主页";
} <!-- 博客列表 -->
<section id="one">
<ul class="actions">
@foreach (var post in Model.Posts)
{
<li>
<header class="major">
<h2>
@post.Title <br />
| @post.CreateTime.ToShortDateString()
</h2> <p>@post.Description</p>
<ul class="actions">
<li>@Html.ActionLink("更多", "Detail", "Home", new { @post.PostId }, new { @class = "button" })</li>
</ul>
</header>
<hr />
</li>
} </ul> <!--分页代码-->
@Html.Pagination(Model.PagingInfo, (info) =>
{
var pagingString = "<ul class=\"actions small\">";
for (var i = 1; i <= info.PageCount; i++)
{
if (i == info.PageIndex)
{
pagingString += "<li><a class=\"special\" href=\"#\">" + i + "</a></li>";
}
else
pagingString += "<li><a class=\"normal\" href=\"" + Url.Action("Index", new { pageIndex = i, pageSize = info.PageSize }) + "\">" + i + "</a></li>";
}
pagingString += "</ul>";
return pagingString;
}) </section> <!--最近作品-->
@Html.Action("RecentWorks", "Work")

这样就可以轻松实现一个快速分页组件啦,我们运行一下,查看效果:

最后点击各页面索引,发现均实现预定目标,到此一个快速分页组件就实现啦。
MVC快速分页的更多相关文章
- .NET手记-ASP.NET MVC快速分页的实现
对于Web应用,展示List是很常见的需求,随之而来的常见的分页组件.jQuery有现成的分页组件,网上也有着大量的第三方分页组件,都能够快速实现分页功能.但是今天我描述的是用基本的C#和html代码 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 基于存储过程的MVC开源分页控件--LYB.NET.SPPager
摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...
- 基于存储过程的MVC开源分页控件
基于存储过程的MVC开源分页控件--LYB.NET.SPPager 摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件M ...
- ssm+maven+pageHelper搭建maven项目实现快速分页
ssm+maven+pageHelper搭建maven项目实现快速分页 PageHelper分页使用: 插件的环境引入: 1.pom文件中引入分页插件的资源位置: <dependency> ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- MySQL大数据量快速分页实现(转载)
在mysql中如果是小数据量分页我们直接使用limit x,y即可,但是如果千万数据使用这样你无法正常使用分页功能了,那么大数据量要如何构造sql查询分页呢? 般刚开始学SQL语句的时候,会这 ...
随机推荐
- 如何理解java回电话
同android中间Button的setOnClickListener这个回调案例: Button button = (Button)this.findViewById(R.id.button); b ...
- 16位图像Alpha混合的实现(用汇编写的,比MMX还要快)
Alpha 混合的算法很简单,基于下面的公式就可以实现: D := A * (S - D) / 255 + D D 是目标图像的像素, S 是源图像的像素 A 是 Alpha 值, 0 为全透明, 2 ...
- MySql 链接url 参数详解
最近 整理了一下网上关于MySql 链接url 参数的设置,有不正确的地方希望大家多多指教: mysql JDBC URL格式如下: jdbc:mysql://[host:port],[host:po ...
- C++ 指针—02 指针与引用的对照
★同样点: ●都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名. ★不同点: ●指针是一个实体,而引用仅是个别名: ●引用仅仅能在定义时被初始化一次,之后不可变: ...
- Typings实现智能
在Visual Studio Code中通过Typings实现智能提示功能 前言 我们知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也有一些简单的提示,但这是通过代码片段提供的.功能 ...
- android画笔错位问题的解决
下面的画画板的代码: public class MainActivity extends Activity { private ImageView iv; private Bitmap baseBit ...
- ios 6 横竖屏转换
xcode 版本4.5 模拟器:6.0 项目需求:刚进去界面横屏,从这个界面进去的界面全是竖屏. 程序的根控制器用了UINavigationController.下面是代码: 1.在appde ...
- cocos2d-x CCNode类
文章引用自http://blog.csdn.net/qiurisuixiang/article/details/8763260 1 CCNode是cocos2d-x中一个非常重要的类.CCNode是场 ...
- hdu 4685 Prince and Princess(匈牙利算法 连通分量)
看了别人的题解.须要用到匈牙利算法的强连通算法 #include<cstdio> #include<algorithm> #include<vector> #pra ...
- Lichee (五岁以下儿童) sysconfig1.fex 配置系统
sysconfig配置系统,作为一个通用的软件平台,还希望通过它.能够适应用户不同的方案.通过给出一个相应的配置.用户的方案就能够自己主动执行,而不须要改动系统里面的代码,或者又一次给出參数. 一. ...