波斯马BOSSMA Information Technology

发布一个ASP.NET MVC的分页控件(扩展UrlHelper)

发布时间:2012年2月10日 / 分类:ASP.NET MVC / 19,835 次浏览 / 评论

关于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);
        }
    }
}

看看效果:

文中的源码没有实现页码分段显示,有兴趣的朋友可以自己试试,或者猛烈点击下载完整版

 

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《发布一个ASP.NET MVC的分页控件(扩展UrlHelper)

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

目前有4 条评论

  1. 斯克迪亚 0楼:

    你是否想过访问的网址除了分页之外还有其它url参数的情况?这样岂不是全部丢掉了?
    另外这个貌似应该写为HtmlHelper的扩展方法,Url是管网址的,不是管生成代码的。

  2. 花郎吧 0楼:

    逛了博主的博客 看来自己还有很长的学习路啊

发表评论