一个支持普通分页和综合分页的MVC分页Helper

针对这个话题,我将提供一个完整的攻略来实现一个支持普通分页和综合分页的MVC分页Helper。

目录

前言

MVC中的分页是非常常见的需求,通过分页我们可以实现对数据的有序浏览和管理。普通分页的实现其实并不是太难,但是如何实现综合分页则有些复杂。在这里,我将给出一种统一的方法,实现一个可以同时支持普通分页和综合分页的MVC分页Helper。

步骤1:创建分页Helper

首先,我们需要创建一个MVC分页Helper。它将接受以下参数:

  • totalCount: 包含在分页中的数据总数。
  • pageSize: 分页大小,即每页包含的条目数。
  • currentPage: 当前页码数。
  • actionName: 控制器中处理此请求的操作名称。
  • routeValues: 路由值,包含请求中的所有参数。

首先,我们需要创建一个扩展方法来创建MVC分页Helper。

public static class PaginationHelper
{
    public static MvcHtmlString Pager(
        this HtmlHelper html,
        int totalRecords,
        int pageSize,
        int currentPage,
        string actionName,
        object routeValues = null)
    {
        // 分页逻辑
    }
}

接下来,我们需要完成分页逻辑。在此方法中,我们需要计算出总页数,以及当前页的前N个和后N个页码。我们还需要创建分页链接,使用户能够在分页之间导航。

下面是实现这些逻辑的示例代码:

public static MvcHtmlString Pager(
        this HtmlHelper html,
        int totalRecords,
        int pageSize,
        int currentPage,
        string actionName,
        object routeValues = null)
{
    var totalPages = (int)Math.Ceiling((double)totalRecords / pageSize);
    var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
    var currentPageUrl = urlHelper.Action(actionName, routeValues);
    var output = new StringBuilder();

    if (totalPages < 2)
    {
        return MvcHtmlString.Empty;
    }

    output.Append("<ul class=\"pagination\">");

    if (currentPage > 1)
    {
        var prevPageUrl = urlHelper.Action(actionName, new RouteValueDictionary(routeValues)
        {
            ["page"] = currentPage - 1
        });
        output.AppendFormat("<li><a href='{0}'>«</a></li>", prevPageUrl);
    }

    int startPage = 1, endPage = 1;
    const int maxPagesToShow = 9;

    if (totalPages <= maxPagesToShow)
    {
        startPage = 1;
        endPage = totalPages;
    }
    else
    {
        var middlePage = currentPage - (maxPagesToShow / 2);

        if (middlePage > totalPages - maxPagesToShow)
        {
            middlePage = totalPages - maxPagesToShow + 1;
        }

        if (middlePage < 1)
        {
            middlePage = 1;
        }

        startPage = middlePage;
        endPage = middlePage + maxPagesToShow - 1;
    }

    for (int i = startPage; i <= endPage; i++)
    {
        var pageUrl = urlHelper.Action(actionName, new RouteValueDictionary(routeValues)
        {
            ["page"] = i
        });
        if (i == currentPage)
        {
            output.AppendFormat("<li class='active'><a href='{0}'>{1}</a></li>", pageUrl, i);
        }
        else
        {
            output.AppendFormat("<li><a href='{0}'>{1}</a></li>", pageUrl, i);
        }
    }

    if (currentPage < totalPages)
    {
        var nextPageUrl = urlHelper.Action(actionName, new RouteValueDictionary(routeValues)
        {
            ["page"] = currentPage + 1
        });
        output.AppendFormat("<li><a href='{0}'>»</a></li>", nextPageUrl);
    }

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

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

步骤2:使用分页Helper

在步骤1中,我们创建了一个名为“Pager”的MVC分页Helper。现在我们来演示如何使用它。

@Html.Pager(
    totalRecords: 100,
    pageSize: 10,
    currentPage: ViewBag.CurrentPage,
    actionName: "Index",
    routeValues: new { q = Request.QueryString["q"] })

在这个示例中,我们将分页帮助程序嵌入视图文件中。它用于管理一组包含在满足某些搜索条件的结果集中的结果。

通过指定当前页,总记录数,页大小和Action名称以及当前请求参数等信息,分页帮助程序可以生成分页代码。

示例1:普通分页

下面是一个示例,演示了如何使用我们的MVC分页Helper来创建普通分页。

public ActionResult Index(int page=1)
{
    var pageSize = 10;
    var data = _repository.GetAll().OrderBy(x => x.Name).Skip((page - 1) * pageSize).Take(pageSize).ToList();
    var totalCount = _repository.GetAll().Count;
    ViewBag.CurrentPage = page;
    return View(data);
}

在这个示例中,我们从存储库中获取所有数据,并对其进行排序。然后,我们使用MVC分页Helper根据分页大小和请求页面的页码生成分页代码。

示例2:综合分页

下面是一个示例,演示如何使用我们的MVC分页Helper来创建综合分页。

public ActionResult Index(string category = null, int page = 1)
{
    var pageSize = 10;
    IQueryable<Product> data = _repository.GetAll();

    if (!string.IsNullOrEmpty(category))
    {
        data = data.Where(x => x.Category == category);
    }

    var totalCount = data.Count();
    var products = data.Skip((page - 1) * pageSize).Take(pageSize).ToList();

    ViewBag.CurrentPage = page;
    ViewBag.Category = category;
    ViewBag.Categories = new SelectList(_repository.GetAllCategories());
    return View(products);
}

在这个示例中,我们从库中获取所有产品,然后过滤结果以匹配指定的类别。 然后,我们使用MVC分页帮助程序根据过滤和分页参数生成分页代码。

这里的例子有两条:

  1. 通过一个查询参数 category 进行搜索筛选,并且可通过分页控件进行分页展示。
  2. 可以进行多条件综合搜索,比如多选时即传递一个数组的参数,同时把当前的页码、每页显示的记录数以及其它必要信息传递进去。

到这里,本攻略就结束了。我们可以使用相同的方法来创建其他的MVC分页help,例如针对Web API分页,以及单页应用程序(SPA)中的分页。如果你认为我遗漏了什么,请在评论中告诉我!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个支持普通分页和综合分页的MVC分页Helper - Python技术站

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

相关文章

  • ASP.NET/C#中如何调用动态链接库DLL

    调用动态链接库(DLL)是在编程过程中常见的需求,本文将介绍如何在ASP.NET/C#中调用DLL文件。具体步骤如下: 第一步:在项目中添加DLL文件 将需要调用的DLL文件添加到项目中,通常可以通过以下两种方式实现: 在Visual Studio解决方案中添加现有项:右键单击要添加文件的文件夹,选择“添加现有项”,在文件对话框中选择DLL文件,单击“添加”…

    C# 2023年5月31日
    00
  • jQuery $.get 的妙用 访问本地文本文件

    下面是关于“jQuery $.get的妙用访问本地文本文件”的完整攻略,包含两个示例。 1. jQuery $.get访问本地文本文件简介 在Web开发中,我们经常需要访问本地文本文件。使用jQuery的$.get方法可以轻松地访问本地文本文件。$.get方法是jQuery中的一个AJAX方法,可以用于从服务器加载数据。在本地文件中,我们可以使用$.get方…

    C# 2023年5月15日
    00
  • JavaScript Date对象详解

    JavaScript Date对象详解 简介 JavaScript中的Date对象用于处理日期和时间相关的操作。它提供了很多便捷的方法,比如获取当前时间,格式化输出日期等等。在本篇文章中,我们将从以下几个方面对Date对象进行详细讲解: Date对象的创建 Date对象的方法使用 Date对象的实例化 计算时间差 示例讲解 1. Date对象的创建 初始化一…

    C# 2023年5月15日
    00
  • C#强制类型转换小结

    C#强制类型转换小结 在C#中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。在某些情况下,编译器可以自动执行类型转换,这称为隐式类型转换。但是在其他情况下,需要手动控制类型转换,这称为强制类型转换。 强制类型转换的语法 强制类型转换可以通过使用括号和类型名称来实现。语法如下: (type) expression 其中,type 是要转换成的类型,…

    C# 2023年5月15日
    00
  • 利用JQuery直接调用asp.net后台的简单方法

    当使用 ASP.NET 进行 Web 开发时,常常需要通过 Ajax 技术实现与后台服务器的数据交互,实现无刷新或部分刷新的效果。JQuery 是一个流行的 JavaScript 库,它可以轻松地实现与后台 ASP.NET 及其他服务器端语言的交互。 下面是几个简单方法,利用 JQuery 直接调用 ASP.NET 后台程序以及如何从后台程序返回数据。 一、…

    C# 2023年6月3日
    00
  • ASP.NET Core基础之Main方法讲解

    ASP.NET Core基础之Main方法讲解 在 ASP.NET Core 中,Main 方法是应用程序的入口点。在本攻略中,我们将介绍 ASP.NET Core 中 Main 方法的用法,包括如何配置应用程序和如何运行应用程序。以下是 ASP.NET Core 基础之 Main 方法讲解的完整攻略: 步骤一:创建 ASP.NET Core 应用程序 首先…

    C# 2023年5月17日
    00
  • C#中LINQ to DataSet操作及DataTable与LINQ相互转换

    C#中LINQ to DataSet操作及DataTable与LINQ相互转换 简介 LINQ to DataSet是指使用LINQ技术访问和操作DataSet对象的数据。使用LINQ to DataSet可以将DataSet中的数据以一个强类型的方式表示出来,并且可以直接使用LINQ语言进行过滤、匹配和排序。 同时,DataTable与LINQ之间也可以进…

    C# 2023年6月1日
    00
  • .Net Core服务治理Consul使用服务发现

    .NET Core服务治理Consul使用服务发现 在微服务架构中,服务发现是一项非常重要的任务。Consul是一种流行的服务发现工具,它可以帮助我们管理和发现微服务。在本攻略中,我们将详细讲解如何使用Consul进行服务发现,并提供两个示例说明。 步骤一:安装Consul 要使用Consul进行服务发现,您需要先安装Consul。您可以从Consul的官方…

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