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 core前端框架Blazor介绍

    Blazor 是一个使用 C# 和 Razor 语法构建现代 Web 应用程序的开源框架。它允许开发人员使用 C# 语言编写客户端代码,而无需使用 JavaScript。以下是 Asp.net core 前端框架 Blazor 的详细介绍: Blazor 的工作原理 Blazor 的工作原理是将 C# 代码编译成 WebAssembly,然后在浏览器中运行。…

    C# 2023年5月17日
    00
  • 在Blazor中使用Chart.js生成图表

    1. 在Blazor中使用Chart.js 首先,从Chart.js官方网站下载Chart.js库文件。推荐下载这个构建好的版本https://cdnjs.com/libraries/Chart.js,最新版是v4.2.1 在Blazor项目中把刚刚下载好的Chart.js放到wwwroot目录下。 在Blazor项目中的Pages文件夹下_Host.csh…

    C# 2023年4月18日
    00
  • C#创建及访问网络硬盘的实现

    C#创建及访问网络硬盘的实现 什么是网络硬盘 网络硬盘是一种将物理硬盘或云存储服务通过网络连接的形式,使得用户可以使用网络来进行硬盘存储和获取数据的设备或服务。 实现 在C#中,可以通过调用System.IO命名空间下的Directory类和File类等来创建及访问网络硬盘。 创建文件夹 对于创建文件夹,可以通过Directory.CreateDirecto…

    C# 2023年6月1日
    00
  • C# readnodefile()不能读取带有文件名为汉字的osg文件解决方法

    问题描述:在使用C#的readnodefile()函数读取osg文件时,如果文件名中带有汉字,函数会出现错误无法读取文件的情况。那么该如何解决这个问题呢?我们可以按照以下步骤进行尝试解决。 解决方案: Step 1. 确认文件路径是否正确 在使用readnodefile()函数读取文件时,首先需要确认传入的文件路径是否正确。检查是否在路径中包含了文件名中带有…

    C# 2023年6月1日
    00
  • C#泛型约束的深入理解

    C#泛型约束的深入理解 在学习C#泛型的实现过程中,我们需要更深入地理解泛型约束的概念。泛型约束可以对泛型类型参数进行属性和方法的限制,以确保类型参数在方法体中被正确地执行。本篇文章将根据具体的代码示例,介绍泛型约束的相关知识。 泛型约束的语法 泛型定义时,可以在定义类型参数的时候添加约束标记,采用where关键字进行表达,语法格式如下: class Som…

    C# 2023年6月7日
    00
  • asp.net网站底部的版权信息实现代码且可维护

    关于ASP.NET网站底部的版权信息实现代码,一般有两种常见的实现方式,分别是通过ASP.NET Master页和ASP.NET User Control实现。 通过ASP.NET Master页实现 步骤一:创建Master页 在Visual Studio中创建Web应用程序,添加Master Page,并设置该Master Page为网站默认页。在Mas…

    C# 2023年5月31日
    00
  • C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    下面就来详细讲解一下“C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析”的攻略。 前言 在C#编程中,我们经常需要使用定时器来执行一些计划任务,比如定时刷新UI、周期性地打印日志等。而在.NET Framework中,给我们提供了三种常用的定时器类,它们分别是:Forms.Timer、Timers.Timer和…

    C# 2023年5月15日
    00
  • C#使用命名管道Pipe进行进程通信实例详解

    下面我会给出一份完整的“C#使用命名管道Pipe进行进程通信实例详解”的攻略。 1. 什么是命名管道 命名管道(Named Pipe)是一种进程间通信(IPC)的方式,通过以名称命名的管道进行数据交换,起到了进程之间传输数据的作用。 命名管道通过文件系统创建,并且在创建的时候必须指定管道的名称。该名称由一些不包含任何非法字符的字符组成(例如,反斜杠 “\”)…

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