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")

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

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

时间: 2024-10-09 01:54:40

MVC快速分页的相关文章

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

目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策略(MVC5+EF6) [第四篇]ASP.NET MVC快速入门之完整示例(MVC5+EF6) [番外篇]ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6) 请关注三石的博客:http://cnblogs.com/sanshi 完善数据注解 到目前为止的表格页面效果: 我们需

MySQL 百万级分页优化(Mysql千万级快速分页)

以下分享一点我的经验 一般刚开始学SQL的时候,会这样写 : SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但在数据达到百万级的时候,这样写会慢死 : SELECT * FROM table ORDER BY id LIMIT 1000000, 10; 也许耗费几十秒 网上很多优化的方法是这样的: SELECT * FROM table WHERE id >= (SELECT id FROM table LIMIT 1000000, 1) LIM

MVC中分页的实现

我在格斗人网 (www.helpqy.com) 中使用了下面的分页技术. 分页可以采用troygoode提供的开源包,其开源网站主页为:https://github.com/TroyGoode/PagedList.具体使用方法如下所示: 1. 通过NuGet下载PagedList.Mvc包,这个包会自动下载另外一个包PagedList,如下所示: 2. 在controller中引入以上两个包,如下所示: 3. 在controller中的ActionResult函数中按照如下最小结构进行调用: 1

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

[第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策略(MVC5+EF6) [第四篇]ASP.NET MVC快速入门之完整示例(MVC5+EF6) [番外篇]ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6) 请关注三石的博客:http://cnblogs.com/sanshi 表单身份验证(Forms Authentication

数往知来 ASP.NET MVC HtmlHelper、MVC快速增删改查 Cache MVC3客户端验证 MVC隐式异步提交 &lt;二十八&gt;

一.HtmlHelper.MVC快速增删改查 MVC 在MVC里面请求首先到控制器-->然后 -->数据库数据放在APP_DATE文件夹里, -->js.css文件放在content文件夹里 -->控制器放在Controllers里,控制器要以controller结尾 控制器下面的所有方法都称为action 2)webform跟 aspnet MVC:区别请求的地址不一样了 MVC请求的是控制器下面的action webform:aspx页面或者是一般处理程序 -->a标签

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

目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策略(MVC5+EF6) [第四篇]ASP.NET MVC快速入门之完整示例(MVC5+EF6) [番外篇]ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6) 请关注三石的博客:http://cnblogs.com/sanshi 数据库连接字符串 上一篇文章中,我们使用MVC的

MVC简单分页

对Car汽车表分页 实现简单分页,放在这里方便查看回顾,自定义每页几条有点问题,有待完善······ 1.新建mvc项目 2.添加linq to sql 数据库连接 3.添加CarBF类 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Mvc简单分页.Models { public class CarBF { private MyDBDataContext

DiscuzRedis 分页扩展 轻松快速分页 避免分页瓶颈

discuz-redis 扩展 轻松快速分页 避免分页瓶颈 设计原理: 1.起因: Discuz!X系列中,使用了SELECT * FROM pre_forum_thread WHERE fid=x AND displayorder IN ORDER BY xxx LIMIT x 这样的sql语句获取当前页的主题列表的.主题越多,翻页的数字越大,在mysql中就越容易出现慢查询,影响性能.表中只对回帖时间字段进行了索引,所以当使用发帖时间.回帖数.查看数排序查看翻页的时候,很容易出现慢查询. 由

Spring MVC 快速入门

Spring MVC 快速入门 环境准备一个称手的文本编辑器(例如Vim.Emacs.Sublime Text)或者IDE(Eclipse.Idea Intellij) Java环境(JDK 1.7或以上版本) Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用IDE并且不使用命令行工具可以不安装) 一个最简单的Web应用 使用Spring Boot框架可以大大加速Web应用的开发过程,首先在Maven项目依赖中引入spring-boot-starter-web:po