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日

相关文章

  • .NET Core(.NET6)中gRPC使用实践

    下面是关于“.NET Core(.NET6)中gRPC使用实践”的完整攻略,包含两个示例。 1. 什么是gRPC gRPC是一种高性能、开源、通用的RPC框架,由Google开发。它使用Protocol Buffers作为接口定义语言(IDL),可以在多种语言中使用,包括C#、Java、Python等。gRPC支持双向流、流控制、消息压缩等特性,可以用于构建…

    C# 2023年5月15日
    00
  • ASP.NET MVC使用Log4Net记录异常日志并跳转到静态页

    下面是ASP.NET MVC使用Log4Net记录异常日志并跳转到静态页的完整攻略。 前置条件 一个已经配置好了的ASP.NET MVC项目 Log4Net库的安装和配置 步骤 第一步:创建Log4Net配置文件 在项目根目录下创建一个Log4Net.config文件,内容为: <?xml version="1.0" encodin…

    C# 2023年6月3日
    00
  • WPF创建Prism应用程序

    WPF 创建 Prism 应用程序的完整攻略 Prism 是一个用于构建 XAML 应用程序的开源框架,它提供了一组工具和库,帮助开发人员构建可扩展、可重用和易于维护的应用程序。本攻略将介绍如何使用 Prism 创建 WPF 应用程序,并提供两个示例说明。 步骤 步骤1:创建 WPF 应用程序 首先,我们需要创建一个 WPF 应用程序。可以使用 Visual…

    C# 2023年5月17日
    00
  • C#实现如何使用短信平台自动通知用户实例

    C#实现使用短信平台自动通知用户 简介 短信通知是现在很多网站或应用程序都采用的一种通知方式,以及提供给客户服务的一种方式。本文将讲解如何使用C#实现自动向用户发送短信通知。 步骤 选择短信平台 首先需要选择一家短信平台进行合作,目前市面上主流的短信平台有阿里云短信、腾讯云短信、云之讯等,选择平台需考虑到短信发送成功率、价格等相关因素。 注册并获取短信API…

    C# 2023年6月6日
    00
  • linq中的连接操作符

    当我们在使用Linq时,有时候我们需要将两个数据源进行连接(Join)操作,LINQ提供了以下几种连接操作符: Inner Join(join in) Left Outer Join (join…into…from…DefaultIfEmpty) Right Outer Join (join…into…from…DefaultIfEm…

    C# 2023年6月1日
    00
  • c#线程Thread示例

    好的。我们先来讲解一下c#线程的概念。 c#线程是指在一个程序中独立运行的执行路径。可以同时运行多个线程,每个线程都是独立运行的,互不干扰。它可以帮助我们完成一些比较复杂的并发操作,例如同时下载多个文件、多线程爬虫、多线程计算等。 下面我们来看一些示例。 示例一:创建线程 在c#中,我们可以通过Thread类创建线程。下面是一个简单的示例: using Sy…

    C# 2023年5月15日
    00
  • Parallel.For循环与普通for循环的性能比较

    针对“Parallel.For循环与普通for循环的性能比较”的话题,我将给出一份详细的攻略,包含以下几个部分: 什么是Parallel.For循环? Parallel.For的性能优势是什么? 如何使用Parallel.For循环? Parallel.For循环的示例说明 普通for循环与Parallel.For循环的性能比较 下面就一步一步进行介绍。 1…

    C# 2023年6月7日
    00
  • AutoCAD二次开发系列教程01-如何在AutoCAD中输出Hello World

    目录 01项目环境准备 02代码示例 03输出示例 04总结 05源码地址 01项目环境准备 A.开发使用的软件:AutoCAD2016、VisualStudio2022 B.建立依赖的本地库(提前从AutoCAD软件安装目录拷贝开发时需要使用的库,如:accoremgd.dll) C.创建新的类库(.Net Framework),注意不同AutoCAD版本…

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