HtmlHelper的扩展分页方法

一、新建一个空MVC项目,命名为MVCAppPager

二、新建一个文件夹PageHelper,在文件夹下新建接口IPageList以及实现类PageList

IPageList接口:

 public interface IPageList
    {
        /// <summary>
        /// 第几页
        /// </summary>
        int PageIndex { get; set; }

        /// <summary>
        /// 每页记录数
        /// </summary>
        int PageSize { get; set; }

        /// <summary>
        /// 总页数
        /// </summary>
        int PageTotal { get; }

        /// <summary>
        /// 记录总数
        /// </summary>
        long RecordTotal { get; set; }

        /// <summary>
        /// 每页开始位置
        /// </summary>
        long CurrentStart { get; }
        /// <summary>
        /// 每页结束位置
        /// </summary>
        long CurrentEnd { get; }
    }

PageList实现类:

public class PageList<T> : List<T>, IPageList
    {
        public PageList(IEnumerable<T> source) : base(source)
        {

        }

        public PageList(IEnumerable<T> source, int pageIndex, int pageSize, long recordTotal)
        {
            if (source != null)
            {
                this.AddRange(source);
            }

            PageIndex = pageIndex;
            PageSize = pageSize;
            RecordTotal = recordTotal;

        }

        public int PageIndex { get; set; }

        public int PageSize { get; set; }

        public long RecordTotal { get; set; }

        public int PageTotal
        {
            get
            {
               return  RecordTotal % PageSize == 0 ? (int)RecordTotal / PageSize : (int)RecordTotal / PageSize + 1;
            }
        }

        public long CurrentStart
        {
            get
            {
                return PageIndex * PageSize + 1;
            }
        }

        public long CurrentEnd
        {
            get
            {
                return (PageIndex + 1) * PageSize > RecordTotal ? RecordTotal : (PageIndex + 1) * PageSize;
            }
        }
    }

三、创建分页HtmlHelper扩展方法Pager

namespace System.Web.Mvc
{
    public static class ExtHelper
    {
        public static MvcHtmlString Pager(this HtmlHelper helper, IPageList list)
        {
            var redirectTo = helper.ViewContext.RequestContext.HttpContext.Request.Url.AbsolutePath;
            var output = new StringBuilder();
            if (list.PageTotal > 1)
            {
                output.AppendFormat("<div class=‘paginator‘>");
                //处理首页连接
                output.AppendFormat("<a class=‘pageLink‘ href=‘{0}?pageIndex=0&pageSize={1}‘>首页</a> ", redirectTo, list.PageSize);

                if (list.PageIndex > 1)
                {//处理上一页的连接
                    output.AppendFormat("<a class=‘pageLink‘ href=‘{0}?pageIndex={1}&pageSize={2}‘>上一页</a> ", redirectTo, list.PageIndex - 1, list.PageSize);
                }
                else
                {
                    output.Append("<a class=‘pageLink‘>上一页</a>");
                }

                output.Append(" ");
                int currint = 5;
                for (int i = 0; i <= 10; i++)
                {//一共最多显示10个页码,前面5个,后面5个
                    if ((list.PageIndex + i - currint) >= 0 && (list.PageIndex + i - currint) < list.PageTotal)
                    {
                        if (currint == i)
                        {//当前页处理
                            output.AppendFormat("<a class=‘cpb‘ href=‘{0}?pageIndex={1}&pageSize={2}‘>{3}</a> ", redirectTo, list.PageIndex, list.PageSize, list.PageIndex + 1);
                        }
                        else
                        {//一般页处理
                            output.AppendFormat("<a class=‘pageLink‘ href=‘{0}?pageIndex={1}&pageSize={2}‘>{3}</a> ", redirectTo, list.PageIndex + i - currint, list.PageSize, list.PageIndex + i - currint + 1);
                        }
                    }
                    output.Append(" ");
                }
                if (list.PageIndex < list.PageTotal - 1)
                {//处理下一页的链接
                    output.AppendFormat("<a class=‘pageLink‘ href=‘{0}?pageIndex={1}&pageSize={2}‘>下一页</a> ", redirectTo, list.PageIndex + 1, list.PageSize);
                }
                else
                {
                    output.Append("<a class=‘pageLink‘>下一页</a>");
                }
                output.Append(" ");
                if (list.PageIndex != list.PageTotal - 1)
                {
                    output.AppendFormat("<a class=‘pageLink‘ href=‘{0}?pageIndex={1}&pageSize={2}‘>末页</a> ", redirectTo, list.PageTotal - 1, list.PageSize);
                }
                output.Append(" ");
            }
            output.AppendFormat("第{0}页 / 共{1}页", list.PageIndex+1, list.PageTotal);//这个统计加不加都行
            output.AppendFormat("</div>");
            return new MvcHtmlString(output.ToString());
        }
    }
}

注意将命名空间修改为:namespace System.Web.Mvc,这样就不用每个页面都要引用命名空间了

四、控制器方式实现

1.在Models文件夹下,新建一个Order实体

namespace MvcAppPager.Models
{
    public class Order
    {
        public long ID { get; set; }

        public string OrderNo { get; set; }

        public decimal WayFee { get; set; }

        public string EMS { get; set; }

    }
}

2.新建一个Home控制器,实现如下

 public class HomeController : Controller
    {
        /// <summary>
        /// 构造数据
        /// </summary>
        List<Order> list = new List<Order>
            {
                new Order { ID = 1,OrderNo="20160510",WayFee=20,EMS="C01111"},
                new Order { ID = 2,OrderNo="20160512",WayFee=10,EMS="C01221"},
                new Order { ID = 3,OrderNo="20160515",WayFee=15,EMS="C03411"},
                new Order { ID = 4,OrderNo="20160518",WayFee=11,EMS="C01341"},
                new Order { ID = 5,OrderNo="20160520",WayFee=16,EMS="C01551"},
                new Order { ID = 6,OrderNo="20160521",WayFee=13,EMS="C02341"}
            };

        // GET: Home
        public ActionResult Index(int pageIndex = 0,int pageSize = 2)
        {
            List<Order> source = list.Skip(pageIndex * pageSize).Take(pageSize).ToList();
            PageList <Order> orderList = new PageList<Order>(source, pageIndex, pageSize, list.Count);
            return View(orderList);
        }
    }

五、Index视图

@model MvcAppPager.PageHelper.PageList<MvcAppPager.Models.Order>

@{
    Layout = null;
}
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <style>
        .paginator {
            font: 12px Arial, Helvetica, sans-serif;
            padding: 10px 20px 10px 0;
            margin: 0px;
        }

            .paginator a {
                border: solid 1px #ccc;
                color: #0063dc;
                cursor: pointer;
                text-decoration: none;
            }

                .paginator a:visited {
                    padding: 1px 6px;
                    border: solid 1px #ddd;
                    background: #fff;
                    text-decoration: none;
                }

            .paginator .cpb {
                border: 1px solid #F50;
                font-weight: 700;
                color: #F50;
                background-color: #ffeee5;
            }

            .paginator a:hover {
                border: solid 1px #F50;
                color: #f60;
                text-decoration: none;
            }

            .paginator a, .paginator a:visited, .paginator .cpb, .paginator a:hover {
                float: left;
                height: 16px;
                line-height: 16px;
                min-width: 10px;
                _width: 10px;
                margin-right: 5px;
                text-align: center;
                white-space: nowrap;
                font-size: 12px;
                font-family: Arial,SimSun;
                padding: 0 3px;
            }
    </style>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>订单号</th>
                <th>运单号</th>
                <th>运费</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td>@item.ID</td>
                    <td>@item.OrderNo</td>
                    <td>@item.EMS</td>
                    <td>@item.WayFee</td>
                </tr>
            }
        </tbody>
    </table>
    @Html.Pager(Model)
</body>

</html>
时间: 2024-10-09 08:42:07

HtmlHelper的扩展分页方法的相关文章

ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: 1 <input name="UserName&q

ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: <input name="UserName&quo

C# 分页方法

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; namespace System.Web.Mvc //注意修改为与HtmlHelper相同的命名空间{ /// <summary> /// 静态 分页方法 /// </summary> public static class MyHtmlHelper { //HtmlHelper的扩展

mybatis常用经典分页方法

来自棱镜学院-在线IT教育www.prismcollege.com 分页方法一: 可以查看如下代码,新建一个数据库分页基础类 package com.ssm.utils.pagination.pagebounds; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spr

基于 HtmlHelper 自定义扩展Container

基于 HtmlHelper 自定义扩展Container Intro 基于 asp.net mvc 的权限控制系统的一部分,适用于对UI层数据呈现的控制,基于 HtmlHelper 的扩展组件 Code 基于 asp.net mvc 的权限控制系统示例代码:https://github.com/WeihanLi/AccessControlDemo 权限控制核心代码:https://github.com/WeihanLi/AccessControlDemo/tree/master/AccessCo

asp.net mvc Htmlhelper简单扩展

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace WebApplication1.MyHtmlHelper { public static class MyHtmlHelper { //页面渲染结果: //<span>我扩展的Label,自动生成Span标签</span> //把标签名都显示(直接将内

Laravel 中通过自定义分页器分页方法实现伪静态分页链接以利于 SEO

我们知道,Laravel 自带的分页器方法包含 simplePaginate 和 paginate 方法,一个返回不带页码的分页链接,另一个返回带页码的分页链接,但是这两种分页链接页码都是以带问号的动态参数形式附加在查询字符串中,形如 https://laravelacademy.org?page=100,但是这种包含动态参数的 URL 格式对 SEO 不友好,我们最好将其转化为 https://laravelacademy.org/page/100 这种不带问号的伪静态分页链接格式,遗憾的是

SqlServer 常用分页方法总结

SqlServer 常用分页方法总结 下面示例总结了,SqlServer数据库 常用分页方法,仅供学习参考 A. 使用 RowNumber 和 Between And 组合分页: /********** 使用 RowNumber 和 Between And 组合分页 **********/ CREATE PROC proc_FuzzySearchAndPaging @pageIndex int, --页索引 @pageSize int, --页大小 @SearchKey Nvarchar(10)

【Javascript】jQuery Validate扩展验证方法

/*****************************************************************jQuery Validate扩展验证方法*****************************************************************/// 判断整数value是否等于0 jQuery.validator.addMethod("isIntEqZero", function (value, element) { valu