对于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 = , int pageSize = )
{
//获取当前分页数据集合
var posts = this.repository.Posts
          .OrderBy(p=>p.UpdateTime) 
.Skip((pageIndex - ) * 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 = ; 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")

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

最后点击各页面索引,发现均实现预定目标,到此一个快速分页组件就实现啦。

.NET手记-ASP.NET MVC快速分页的实现的更多相关文章

  1. MVC快速分页

    .NET手记-ASP.NET MVC快速分页的实现   对于Web应用,展示List是很常见的需求,随之而来的常见的分页组件.jQuery有现成的分页组件,网上也有着大量的第三方分页组件,都能够快速实 ...

  2. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  3. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  4. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  5. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. 学习ASP.NET MVC(十一)——分页

    在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法.分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页.在今天这篇文章中,我们学习如果在MVC页面中使用PagedList. ...

  7. 【第二篇】ASP.NET MVC快速入门之数据注解(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. ASP.NET MVC 简单分页代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. asp.net MVC通用分页组件 使用方便 通用性强

    asp.net MVC通用分页组件 使用方便 通用性强   该分页控件的显示逻辑: 1 当前页面反色突出显示,链接不可点击 2 第一页时首页链接不可点击 3 最后一页时尾页链接不可点击 4 当前页面左 ...

随机推荐

  1. py2与py3区别总结

    1. py2中的str是py3中的bytes py2中的Unicode是py3中的str 声明一个字符串变量时,py2 和py3都是str类型,但py2代表字节类型,py3代表文本类型 隐式转换: p ...

  2. 云笔记项目-网页端debug功能学习

    在做云笔记项目的过程中,除了服务端在eclipse中debug调试代码外,有时候需要在浏览器端也需要进行debug调试,刘老师举了一个冒泡排序算法的dubug例子,进行了讲解. 首先上浏览器端测试代码 ...

  3. Python设计模式 - UML - 包图(Package Diagram)

    简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...

  4. select2清除选择(选择框内的值)

    首先清空option很简单:$("#select2_id").empty();但是这样清除了之后,选中的值仍然在文本框里显示着: 这个功能很小,只是一个函数的问题,之所以写这篇文章 ...

  5. [leetcode]18. 4Sum四数之和

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

  6. Shell脚本中"command not found"报错处理

    字符串的定义与赋值 # 定义STR1变量,值为abc STR1 = "abc"(错误写法) STR1="abc"(正确写法) 在编写java代码时会考虑到格式化 ...

  7. ES6 Iterator

    不同数据集合怎么用统一的方式读取 可以用for...of循环了

  8. [原]OpenStreetMap数据瓦片服务性能篇

    上文说到如何利用node-mapnik架设OpenStreetMap瓦片服务,解决了有没有的问题.然而这个服务还是比较孱弱,主要表现在以下几个方面: 1. Node.js只能使用CPU的一个核,不能有 ...

  9. dos批处理(bat)运行exe

    @echo off SETLOCAL ENABLEDELAYEDEXPANSIONREM 延迟环境变量扩展 color E echo operate:1.start启动 2.stop停止 3.exit ...

  10. 小程序css--view标签下英文不换行,中文会自动换行

    英文且没有空格不会自动换行,中文或者有空格的英文会自动换行 这种情况在css中添加 : word-break: break-all;\   就可以解决