一个支持普通分页和综合分页的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# TreeView无限目录树实现方法

    C# TreeView无限目录树的实现方法可以通过以下步骤完成。 步骤一:设计树状结构 在设计树状结构时,考虑到每个文件夹可以包含多个子文件夹和文件,我们需要设计一个包含以下字段的Folder类: public class Folder { public string Name { get; set; } // 文件夹名称 public string Pat…

    C# 2023年6月8日
    00
  • C# datagrid非常规方法实现添加合并列

    C# 的 Datagrid 是一个非常强大的控件,但是由于它的灵活性,有时候我们需要实现一些非常规的功能,例如实现添加合并列。下面是一份完整攻略。 步骤一:准备工作 在使用非常规方法实现添加合并列之前,我们需要先明确几件事情,分别是: 我们需要使用到 WPF 的 DataGrid 控件,而不是 WinForms 的 DataGridView 控件; 我们需要…

    C# 2023年6月6日
    00
  • 用 FieldMask 提高 C# gRpc 的服务性能

    使用 FieldMask 可以提高 C# gRPC 的服务性能,它的基本原理是:只返回客户端所需要的结果字段,而不是返回整个对象。这样可以减少网络传输时间和带宽消耗,提高服务性能。 下面是使用 FieldMask 的完整攻略: 1. 定义 protobuf 消息 首先,在 protobuf 消息中定义一个 FieldMask 字段,表示客户端要获取的数据字段…

    C# 2023年6月6日
    00
  • csdn 博客中实现运行代码功能实现

    实现csdn博客中运行代码功能可以使用以下两种方法: 方法一:使用CSDN编辑器 登录CSDN博客后台,在编辑器的顶部菜单中点击“插入代码”按钮,或者输入“[[toc]]”快捷键,然后点击Code按钮插入代码框。 插入代码框中分别输入该段代码的语言和代码,可以选择开启行号选项和代码复制按钮选项。例如,输入以下Java代码: public class Hell…

    C# 2023年5月31日
    00
  • IIS7 配置大全(ASP.NET 2.0, WCF, ASP.NET MVC,php)

    IIS7配置大全(ASP.NET2.0,WCF,ASP.NETMVC,php) IIS7是一款强大的Web服务器,支持多种Web应用程序的部署,包括ASP.NET2.0、WCF、ASP.NETMVC和php等。本文将详细讲解如何在IIS7中配置这些Web应用程序,并提供两个示例。 1. 配置ASP.NET2.0应用程序 以下是在IIS7中配置ASP.NET2…

    C# 2023年5月15日
    00
  • ASP.NET Core环境变量配置和启动设置讲解

    ASP.NET Core环境变量配置和启动设置讲解 在ASP.NET Core应用程序中,环境变量和启动设置是非常重要的。本攻略将详细介绍如何在ASP.NET Core应用程序中配置环境变量和启动设置,并提供两个示例说明。 配置环境变量 在ASP.NET Core应用程序中,可以使用环境变量来配置应用程序的行为。可以按照以下步骤操作: 在appsetting…

    C# 2023年5月16日
    00
  • c#格式化数字的方法

    当我们在C#中处理数字时,有时需要格式化数字,比如保留特定数量的小数,增加千分号,增加货币符号等。下面是几种常用的C#格式化数字的方法。 1. ToString方法 ToString方法是C#中最常用的格式化数字的方法之一。通过该方法,可以将数字转换为指定格式的字符串。下面是几个示例: 1.1 保留指定小数位数 double num = 123.456789…

    C# 2023年5月14日
    00
  • C#实现观察者模式(Observer Pattern)的两种方式

    下面我将详细讲解 “C#实现观察者模式(Observer Pattern)的两种方式” 的完整攻略,过程中会包含两条示例说明。 什么是观察者模式? 观察者模式(Observer Pattern)是一种设计模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使得它们能够自动更新自己。 C#…

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