MVC HtmlHelper扩展类(PagingHelper)实现分页功能

下面就为你详细介绍如何使用MVC HtmlHelper扩展类(PagingHelper)实现分页功能。

1. 什么是MVC HtmlHelper扩展类

在MVC开发中,HtmlHelper是负责生成HTML标签的对象,它可以帮助我们快速地生成表单、文本框、下拉框等HTML控件。而MVC HtmlHelper扩展类则是对HtmlHelper进行扩展,使其能够完成更加复杂的任务,比如实现分页、生成统一的表格等。

2. 实现步骤

2.1 定义PagingHelper类

我们首先需要定义一个名为PagingHelper的HtmlHelper扩展类,用于生成分页相关的HTML标记。代码示例如下:

public static class PagingHelper
{
    public static MvcHtmlString Pager(this HtmlHelper htmlHelper, int currentPage, int totalPages, string pageAction, int pageShowCount = 5, string cssClassName = "pagination")
    {
        var pageBuilder = new StringBuilder();
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        pageBuilder.AppendFormat("<ul class='{0}'>", cssClassName);

        //生成首页链接
        var firstPage = $"<li><a href='{urlHelper.Action(pageAction, new { page = 1 })}'>首页</a></li>";
        pageBuilder.Append(firstPage);

        //生成上一页链接
        if (currentPage > 1)
        {
            var prevPage = $"<li><a href='{urlHelper.Action(pageAction, new { page = currentPage - 1 })}'>上一页</a></li>";
            pageBuilder.Append(prevPage);
        }

        //生成中间页码链接
        for (var i = 1; i <= totalPages; i++)
        {
            if (i <= currentPage + pageShowCount / 2 && i >= currentPage - pageShowCount / 2)
            {
                var pageLink = string.Empty;
                if (i == currentPage)
                {
                    pageLink = $"<li class='active'><a href='#'>{i}</a></li>";
                }
                else
                {
                    pageLink = $"<li><a href='{urlHelper.Action(pageAction, new { page = i })}'>{i}</a></li>";
                }

                pageBuilder.Append(pageLink);
            }
        }

        //生成下一页链接
        if (currentPage < totalPages)
        {
            var nextPage = $"<li><a href='{urlHelper.Action(pageAction, new { page = currentPage + 1 })}'>下一页</a></li>";
            pageBuilder.Append(nextPage);
        }

        //生成末页链接
        var lastPage = $"<li><a href='{urlHelper.Action(pageAction, new { page = totalPages })}'>末页</a></li>";
        pageBuilder.Append(lastPage);

        pageBuilder.Append("</ul>");

        return MvcHtmlString.Create(pageBuilder.ToString());
    }
}

以上代码定义了一个名为Pager的扩展方法,它会根据传入的参数生成分页相关的HTML标记。其中currentPage表示当前页码,totalPages表示总页数,pageAction表示分页的Action名称,pageShowCount表示最多显示页码数,cssClassName表示分页的样式。

2.2 在视图中使用PagingHelper

在视图中使用PagingHelper非常简单,只需通过Html.Pager方法调用即可,如下所示:

@Html.Pager(Model.CurrentPage, Model.TotalPages, "Index", 5, "pagination")

以上代码调用了Pager方法,生成了一个名为pagination的分页样式,最多显示5个页码,跳转到名为Index的分页Action。

3. 示例说明

示例1

首先,我们需要在MVC项目中创建一个名为Test的控制器,在Index方法中创建一些用于测试的数据,如下所示:

public ActionResult Index(int page = 1)
{
    const int pageSize = 10;
    var totalCount = 100;

    var startIndex = (page - 1) * pageSize;
    var endIndex = startIndex + pageSize - 1;

    if (endIndex >= totalCount)
    {
        endIndex = totalCount - 1;
    }

    var items = Enumerable.Range(startIndex, endIndex - startIndex + 1);

    var model = new TestViewModel
    {
        Items = items,
        TotalCount = totalCount,
        CurrentPage = page,
        TotalPages = (int)Math.Ceiling((double)totalCount / pageSize)
    };

    return View(model);
}

接着,在Index视图中调用Pager方法生成分页控件:

@model TestViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<table class="table">
    <thead>
        <tr>
            <th>ID</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Items)
        {
            <tr>
                <td>@item</td>
            </tr>
        }
    </tbody>
</table>

@Html.Pager(Model.CurrentPage, Model.TotalPages, "Index", 5, "pagination")

以上代码生成一个表格,并在下方生成一个名为pagination的分页控件。

示例2

接下来,我们可以对分页控件的样式进行自定义。我们可以在~/Content/site.css中添加如下样式:

.pagination {
    display: inline-block;
    padding-left: 0;
    margin: 20px 0;
    border-radius: 4px;
}

.pagination > li {
    display: inline;
}

.pagination > li > a {
    position: relative;
    float: left;
    padding: 6px 12px;
    margin-left: -1px;
    line-height: 1.42857143;
    text-decoration: none;
    background-color: #fff;
    border: 1px solid #ddd;
}

.pagination > li:first-child > a {
    margin-left: 0;
    border-top-left-radius: 4px;
    border-bottom-left-radius: 4px;
}

.pagination > li:last-child > a {
    border-top-right-radius: 4px;
    border-bottom-right-radius: 4px;
}

.pagination > .active > a {
    color: #fff;
    background-color: #337ab7;
    border-color: #337ab7;
}

.pagination > .active > a:hover {
    color: #fff;
    background-color: #286090;
    border-color: #204d74;
}

.pagination > li > a:hover,
.pagination > li > a:focus {
    background-color: #eee;
}

以上样式定义了分页控件的样式,包括颜色、边框、圆角等等。后面的代码则通过调用Pager方法并传入样式名称生成分页控件:

@Html.Pager(Model.CurrentPage, Model.TotalPages, "Index", 5, "pagination custom-paging")

通过以上方法,我们可以实现一个符合自己需求的、美观的分页控件。

这就是使用MVC HtmlHelper扩展类(PagingHelper)实现分页功能的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MVC HtmlHelper扩展类(PagingHelper)实现分页功能 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • asp.net 数组中字符串替换的几种方式

    下面是关于“ASP.NET 数组中字符串替换的几种方式”的详细讲解: 1. 普通 for 循环迭代替换 首先,我们可以使用for循环迭代将数组中所有字符串的指定子串替换成其它字符串。这种方式比较原始,但在某些情境下可能还是非常有效。 下面是示例代码: string[] arr = {"apple", "banana",…

    C# 2023年5月31日
    00
  • .NET Core下使用Log4Net记录日志的方法步骤

    .NET Core下使用Log4Net记录日志的方法步骤 Log4Net是一个流行的日志记录框架,可以在.NET Core应用程序中使用。本攻略将介绍如何在.NET Core应用程序中使用Log4Net记录日志,并提供两个示例说明。 步骤一:安装Log4Net 在.NET Core应用程序中使用Log4Net,需要先安装Log4Net。可以按照以下步骤操作:…

    C# 2023年5月16日
    00
  • Unity创建平铺网格地图的方法

    Unity创建平铺网格地图的方法一般包含以下几个步骤: 步骤一:新建场景 首先,通过“File” > “New Scene”创建一个新场景,然后通过“GameObject” > “3D Object” > “Plane”新建一个平面作为地图。 步骤二:拆分地图 接下来需要将地图拆成若干个小块,这样可以便于一次性放置大量的地图块,在游戏运行时…

    C# 2023年6月3日
    00
  • C#中HttpClient使用注意(预热与长连接)

    C#中HttpClient使用注意(预热与长连接) 在使用HttpClient时需要注意两个方面的问题:预热和长连接。本文将详细讲解这两方面的注意事项和实现方法。 预热 预热是指提前对HttpClient进行初始化,并使其保持一段时间的生命周期,以减少后续的请求延迟。一般来说,在使用HttpClient的应用中,HttpClient实例的创建、初始化和销毁都…

    C# 2023年6月6日
    00
  • c# 反射+自定义特性保存数据至本地

    根据你的需求,我来详细讲解一下“c# 反射+自定义特性保存数据至本地”的完整攻略。 什么是反射和自定义特性 在深入讲解攻略之前,我们先了解一下反射和自定义特性。 反射 反射是.NET框架中一个非常强大的功能,它允许我们在运行时获取元数据,并在运行时动态地创建、操作和销毁对象。通过反射,我们可以在运行时获取并操作类的属性、方法、构造函数等信息。 自定义特性 自…

    C# 2023年6月1日
    00
  • C# WinForm-Timer控件的使用

    C# WinForm-Timer控件的使用攻略 1. 什么是Timer控件 在C# WinForm应用程序中,Timer控件主要用于定时器的功能,并可触发启用与禁用定时器事件。Timer控件是一种精准计时器,可在指定时间间隔后执行特定的事件或操作,并且在许多情况下都是非常有用的。 使用该控件,开发人员可以实现很多定时器应用,例如:倒计时、轮询数据库等等。 2…

    C# 2023年5月14日
    00
  • timespan使用方法详解

    TimeSpan使用方法详解 什么是TimeSpan? TimeSpan是.NET Framework中表示时间间隔的一个结构体,它用于表示两个时间点之间的时间间隔,或一段时间的持续时间。 TimeSpan包括天数、小时数、分钟数、秒数和毫秒数,可以使用各种方式构造TimeSpan实例。TimeSpan在.NET平台中被广泛用于处理时间。 在代码中创建Tim…

    C# 2023年6月1日
    00
  • C# 实现简单打印的实例代码

    C# 实现简单打印的实例代码 简介 在 C# 中,我们可以通过 System.Drawing.Printing 命名空间提供的 PrintDocument 类来实现简单的文本打印。 步骤 1. 引入命名空间 使用 PrintDocument 类需要引入 System.Drawing.Printing 命名空间。 using System.Drawing.Pr…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部