一个支持普通分页和综合分页的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日

相关文章

  • C#使用SendMessage实现进程间通信的方法

    下面我将详细讲解“C#使用SendMessage实现进程间通信的方法”的完整攻略。本篇攻略包含以下几个部分: 介绍进程间通信的概念 介绍在C#中使用SendMessage实现进程间通信的方法 两个示例说明 进程间通信概念 进程间通信(Inter-process communication,IPC)指的是同一台计算机上的多个进程之间的通信。从某种意义上来说,进…

    C# 2023年6月7日
    00
  • C# 获取系统进程的用户名

    下面是关于如何用C#获取系统进程的用户名的完整攻略。 1. 获取系统进程列表 首先,我们需要获取当前系统中的进程列表。可以使用Process类的GetProcesses()方法来完成这个任务。该方法会返回一个Process类型的数组,其中每个元素表示一个系统进程。 下面是一个简单的示例代码: Process[] processlist = Process.G…

    C# 2023年6月7日
    00
  • asp.net Repeater 数据绑定的具体实现(图文详解)

    当我们需要在ASP.NET网站中显示重复数据时,asp.net Repeater控件是一个很好的选择。Repeater可以通过绑定数据源来在网站上显示重复的数据。以下是asp.net Repeater数据绑定的具体实现攻略。 第一步:创建一个asp.net网站 首先,打开Visual Studio并创建一个新的ASP.NET网站。可以选择任何类型的ASP.N…

    C# 2023年6月3日
    00
  • efcore性能调优

    性能调优——EFCore调优 按下硬件、网络不提,我们单表从程序层面对系统的性能进行优化,翻来覆去无外乎三个方面 缓存 异步 sql本片文章,我们针对.net core web项目的ef core框架进行性能优化。 1. EF Core框架已经本地缓存机制memorycache,所以我们访问一个接口,二次访问的性能相比首次会提升一大截 2.尽可能的通过主键查…

    C# 2023年5月5日
    00
  • C#获取鼠标在listview右键点击单元格的内容方法

    首先,要获取鼠标在listview右键点击单元格的内容,需要以下几个步骤: 给listview绑定MouseClick事件 判断是否是鼠标右键点击 判断是否是点击了单元格 获取单击的行和列信息 获取单元格内容 下面是具体的代码和示例: 给listview绑定MouseClick事件 listView1.MouseClick += listView1_Mous…

    C# 2023年6月8日
    00
  • c# 文件压缩zip或将zip文件解压的方法

    请看下面的详细讲解: 1. c# 文件压缩zip的方法 1.1 引用System.IO.Compression和System.IO.Compression.FileSystem命名空间 using System.IO.Compression; using System.IO.Compression.FileSystem; 1.2 创建压缩文件方法 // 压缩…

    C# 2023年6月1日
    00
  • C#中通过API实现的打印类 实例代码

    以下是一个使用C#中API实现的打印类的示例代码: using System; using System.Drawing.Printing; class Program { static void Main() { PrintDocument pd = new PrintDocument(); pd.PrintPage += new PrintPageEve…

    C# 2023年5月15日
    00
  • C#中设计、使用Fluent API

    设计和使用Fluent API是C#的一个非常重要的特性,它可以极大地提升我们代码的可读性和可维护性。在本篇文章中,我将为大家详细讲解如何在C#中设计和使用Fluent API,并提供两个示例说明。 Fluent API是什么 Fluent API是一种使用方法链的API设计风格,它允许我们编写从上到下的代码,使得我们的逻辑更易于理解和调整。 与传统的API…

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