关于asp.net mvc的分页,网上已经有很多了。本来也想借用,先看了杨涛写的分页控件,感觉用起来稍微有点复杂,而我只需要简单的分页。分页我写过很多次,原理也熟悉,就是构造首页、上一页、下一页及末页的链接,做得好点,还可以有页码、下拉分页等。于是我又造了一个轮子。

先准备数据,这里以人员信息为例:

public class PersonInfo
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

初始化100条数据,并提供一个方法,可以从这些数据中按照分页大小和页码获取。

public class PersonHelper
{
    private static List<PersonInfo> list;
    static PersonHelper()
    {
        list = new List<PersonInfo>();
        for (int i = 0; i < 100; i++)
        {
            list.Add(new PersonInfo()
            {
                Name = "姓名" + i.ToString(),
                Age = 18 + i
            });
        }
    }
    /// <summary>
    ///
    /// </summary>
    /// <returns></returns>
    public static IEnumerable<PersonInfo> GetList(int pageSize, int pageIndex)
    {
        return list.Skip((pageIndex - 1) * pageSize).Take(pageSize);
    }
}

Model定义:其中包含了分页大小、当前页码、记录数和人员信息集合。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcApplication2.Code;
  
namespace MvcApplication2.Models
{
    public class PersonListModels
    {
        public int PageIndex { get; set; }
        public int PageSize { set; get; }
        public int RecordCount { get; set; }
        public IEnumerable<PersonInfo> Persons { get; set; }
    }
}

Controller中的处理:

public ActionResult PersonList(int? pageIndex)
        {
            // 分页大小
            int pageSize = 10;
  
            // 获取分页页码
            if (pageIndex == null || pageIndex <= 0)
            {
                pageIndex = 1;
            }
  
            // 获取分页数据
            IEnumerable<PersonInfo> query = PersonHelper.GetList(pageSize, pageIndex.Value);
  
            // 设置模型
            NewsModels model = new NewsModels()
            {
                Persons = query,
                PageIndex = pageIndex.Value,
                PageSize = pageSize,
                RecordCount = 100
            };
  
            return View(model);
        }

View中处理:

@model MvcApplication2.Models.PersonListModels
@{
    ViewBag.Title = "Person List";
}
<h2>
    Person List</h2>
<table>
    @foreach (MvcApplication2.Code.PersonInfo info in Model.Persons)
    {
        <tr>
            <td>@info.Name
            </td>
            <td>@info.Age
            </td>
        </tr>
    }
    <tr>
        <td colspan="2">
            @Url.Pager("Home", "PersonList", Model.PageSize, Model.PageIndex, Model.RecordCount)
        </td>
    </tr>
</table>

重点就在@Url.Pager的使用了。扩展UrlHelper的代码如下:

namespace System.Web.Mvc
{
    public static class HtmlExtend
    {
        /// <summary>
        /// 扩展UrlHelper,实现输出分页HTML
        /// </summary>
        /// <param name="urlHelper"></param>
        /// <param name="controllerName">控制器名</param>
        /// <param name="actionName">行为名</param>
        /// <param name="pageSize">分页大小</param>
        /// <param name="pageIndex">当前页码</param>
        /// <param name="recordCount">总记录数</param>
        /// <returns></returns>
        public static MvcHtmlString Pager(this UrlHelper urlHelper, string controllerName, string actionName, int pageSize, int pageIndex, int recordCount)
        {
            // 如果分页大小等于0,则返回空字符串
            if (pageSize == 0)
            {
                return MvcHtmlString.Create(string.Empty);
            }
  
            // 根据总记录数和分页大小计算出分页数量
            int pageCount = (int)decimal.Ceiling((decimal)recordCount / (decimal)pageSize);
  
            // 首页、末页
            string firstStr = string.Empty;
            string lastStr = string.Empty;
            if (recordCount > 0)
            {
                string firstUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = 1 });
                firstStr = "<a href='" + firstUrl + "'>首页</a>";
  
                string lastUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = pageCount });
                lastStr = "<a href='" + lastUrl + "'>末页</a>";
            }
            else
            {
                firstStr = "首页";
                lastStr = "末页";
            }
  
            // 上一页
            string preStr = string.Empty;
            if (pageIndex > 1 && pageIndex <= pageCount)
            {
                string prevUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = pageIndex - 1 });
                preStr = "<a href='" + prevUrl + "'>上一页</a>";
            }
            else
            {
                preStr = "上一页";
            }
  
            // 下一页
            string nextStr = string.Empty;
            if (pageIndex > 0 && pageIndex < pageCount)
            {
                string nextUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = pageIndex + 1 });
                nextStr = "<a href='" + nextUrl + "'>下一页</a>";
            }
            else
            {
                nextStr = "下一页";
            }
  
            // 页码
            string numStr = string.Empty;
            if (pageCount > 0)
            {
                // 遍历输出全部的页码
                for (int i = 1; i <= pageCount; i++)
                {
                    string numUrl = urlHelper.Action(actionName, controllerName, new { pageIndex = i });
  
                    // 当前页码加粗
                    if (i == pageIndex)
                    {
                        numStr += "[<a href='" + numUrl + "'><strong>" + i + "</strong></a>] ";
                    }
                    else
                    {
                        numStr += "[<a href='" + numUrl + "'>" + i + "</a>] ";
                    }
                }
            }
  
            string pageStr = firstStr + " " + preStr + " " + numStr + nextStr + " " + lastStr;
  
            return MvcHtmlString.Create(pageStr);
        }
    }
}

看看效果:

这个扩展没有实现页码分段显示,有兴趣的朋友可以自己试试。

文章来源:http://blog.bossma.cn/asp_net_mvc/asp-net-mvc-url-pager/

关于Mvc的分页写法的更多相关文章

  1. 基于存储过程的MVC开源分页控件--LYB.NET.SPPager

    摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...

  2. 基于存储过程的MVC开源分页控件

    基于存储过程的MVC开源分页控件--LYB.NET.SPPager 摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件M ...

  3. Mvc自定义分页控件

    MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候, ...

  4. MVC简单分页

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

  5. MVC快速分页

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

  6. MVC自定义分页

    MVC自定义分页 之前我发表了一篇MVC无刷新分页的文章,里面用的是MvcPager控件,但是那个受那个控件限制,传值只能用PagedList,各方面都受到了限制,自由度不够高,现在还是做MVC无刷新 ...

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

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

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

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

  9. [Oracle]关于Oracle分页写法的性能分析及ROWNUM说明

    关于分页写法的性能分析及ROWNUM的补充说明 分页写法 一.测试前数据准备 SQL> SELECT COUNT(*) FROM BPM_PROCVAR; COUNT(*) ---------- ...

随机推荐

  1. mysql用sql创建表完整实例

    create table user_login_latest( id int(11) unsigned NOT NULL AUTO_INCREMENT, user_id int(11) not nul ...

  2. C 语言开发初涉-01 简单学习

    尝试用C语言写windows程序: 简单的计算器 1.0版,仅用来熟悉C 开发windows的一些语法和语句用法 #include "stdafx.h" #include < ...

  3. axios post传参后台无法接收问题

    起因是在angular项目中使用axios发送post请求,向后台传参后台一直无法接收,网上查了有说是请求头设置不对,需要把Content-Type:application/x-www-form-ur ...

  4. Android Studio升级后报 method not found: 'runProguard'的错误

    今天升级了下Android Studio,然后发现更新gradle,然后在sync项目的时候总是报  method not found: 'runProguard'的错误 找了很多发现不对. 最后解决 ...

  5. d3.js:数据可视化利器之快速入门

    hello,data! 在进入d3.js之前,我们先用一个小例子回顾一下将数据可视化的基本流程. 任务 用横向柱状图来直观显示以下数据: var data = [10,15,23,78,57,29,3 ...

  6. AntiSamy测试

    AntiSamy为owasp针对xss提供的处理库,可以配置xml策略来决定过滤的内容,比如标签.属性.css等,自定义策略给开发人员使用成本比较高,AntiSamy也提供了几个内置的策略,其安全级别 ...

  7. finecms万能标签list列表使用方法

    我们在用finecms建站时经常会用到调用文章列表的功能,这时我们可以用万能标签list来实现,当然还可以调用其他一些数据,下面我们就来看看list函数的相关参数和使用方法 action 支持&quo ...

  8. html5游戏开发--"动静"结合(二)-用地图块拼成大地图 & 初探lufylegend

    一.前言 本次教程将向大家讲解如何用HTML5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏. 首先让我们来了解了解如何用html5实现动画,毕竟“ ...

  9. libx264 安卓编译

    https://github.com/RoyGuanyu/build-scripts-of-ffmpeg-x264-for-android-ndk/blob/master/ffmpeg/build_a ...

  10. 如何保护自己的GitHub代码不被别人覆盖

    我们在自己的github上创建了免费的公开代码,为了防止别人通过git push upstream master 覆盖了自己原有的代码,需要作一下设置:Settings->Branchs,然后在 ...