在ASP.NET Core MVC中实现分页功能


当我正在寻找一种实现分页功能的方法时,我想介绍一种从头开始编写代码的方法,以及另一种使用包来实现它的方法。

环境

  • ASP.NET Core 2.2
  • ASP.NET Core MVC
  • 引导程序4
  • Visual Studio 2019
  • X.PagedList.Mvc.Core7.9.0(NuGet包)

假定商店管理功能将在已注册商店的列表页面上实现分页功能。

编写和实现1

中的代码

参考站点

向学生/索引添加分页(Microsoft)

1.创建用于分页

的新类

PaginatedList.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace ContosoUniversity
{
    public class PaginatedList< T > : List< T >
    {
        public int PageIndex { get; private set; }
        public int TotalPages { get; private set; }

        public PaginatedList(List< T > items, int count, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            TotalPages = (int)Math.Ceiling(count / (double)pageSize);

            this.AddRange(items);
        }

        public bool HasPreviousPage
        {
            get
            {
                return (PageIndex > 1);
            }
        }

        public bool HasNextPage
        {
            get
            {
                return (PageIndex < TotalPages);
            }
        }

        public static async Task<PaginatedList< T >> CreateAsync(IQueryable< T > source, int pageIndex, int pageSize)
        {
            var count = await source.CountAsync();
            var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
            return new PaginatedList< T >(items, count, pageIndex, pageSize);
        }
    }
}

2.更改索引操作方法

控制器/ ShopController.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
        public async Task<IActionResult> Index(int? pageNumber)
        {
            // 「編集」「詳細」ページから戻ってくる際の?????番号保持
            ViewData["pageNumber"] = pageNumber ?? 1;

            // ソートデータ取得用のクエリ発行
            var shops = _context.Shop.Select(m => m);

            // 1ページ内の項目レコード表示数
            int pageSize = 5;

            return View(await PaginatedList<Shop>.CreateAsync(shops.AsNoTracking(), pageNumber ?? 1, pageSize));
        }

3.添加分页链接

第一个模型语句中的

分页列表