C# 分页:完整指南及简单代码示例 📚

2025-06-08

C# 分页:完整指南及简单代码示例 📚

Csharp 分页功能介绍

今天,我们将深入探讨 C# 中的分页功能。想象一下,展示一个拥有数千本书的图书馆——您肯定不希望用户无休止地滚动页面吧?这时,分页功能就能派上用场了!我们将探讨分页是什么、它为何重要,以及在哪些常见场景下需要它。

什么是分页?

分页是一种将大型数据集拆分成更小、更易于管理的块或页面的技术。就像读书一样——你不是一次看完整本书,而是一次读一页。

为什么要在 Web 应用程序中使用分页?

分页功能通过一次仅加载部分数据来帮助提升用户体验。它缩短了加载时间,降低了服务器压力,并使用户更轻松地浏览数据。

分页的常见场景

  • 电子商务商店的产品列表

  • 数据库中的搜索结果

  • 在管理面板中显示日志条目

一旦我们知道了分页是什么,我们就开始了解如何在 C# 项目中实现分页!

在 Csharp 中实现分页

让我们从 C# 中的分页设置开始。我们将讨论一些基础知识,例如SkipTake 方法,以及LINQ和 ASP.NET Core的使用方法等等。系好安全带!

使用 Skip 和 Take 进行基本分页

要在 C# 中对数据进行分页,可以结合使用SkipTake方法。以下是一个简单的示例:


var pageNumber = 1;

var pageSize = 10;

var paginatedData = dataArray

    .Skip((pageNumber - 1) * pageSize)

    .Take(pageSize)

    .ToList();

Enter fullscreen mode Exit fullscreen mode

在此代码片段中:

  • pageNumber:要显示的页码。

  • pageSize:每页显示多少个项目。

  • Skip:跳过指定数量的元素。

  • Take:获取跳过后指定数量的元素。

使用 LINQ 实现高效分页

LINQ(语言集成查询)是 C# 中的一个强大工具。使用 LINQ 进行分页非常简单,而且可读性极佳:


var pageNumber = 2;

var pageSize = 5;

var pagedQuery = from item in dataArray

                 orderby item.SomeProperty

                 select item;

var paginatedResult = pagedQuery

    .Skip((pageNumber - 1) * pageSize)

    .Take(pageSize)

    .ToList();

Enter fullscreen mode Exit fullscreen mode

SomeProperty此示例在应用Skip和之前按以下方式对项目进行排序Take

ASP.NET Core 中的分页

ASP.NET Core 使分页更加简单。你可以在控制器中创建分页响应:


[HttpGet]

public IActionResult GetPagedData(int pageNumber = 1, int pageSize = 10)

{

    var data = _context.DataSet

        .Skip((pageNumber - 1) * pageSize)

        .Take(pageSize)

        .ToList();



    return Ok(data);

}

Enter fullscreen mode Exit fullscreen mode

就这样,您的 API 端点已准备好提供分页数据。

使用 Entity Framework Core 处理分页

Entity Framework Core (EF Core) 支持开箱即用的分页功能。以下是使用 EF Core 对数据进行分页的示例:


public async Task<IActionResult> GetPagedData(int pageNumber = 1, int pageSize = 10)

{

    var data = await _context.DataEntities

        .OrderBy(d => d.SomeProperty)

        .Skip((pageNumber - 1) * pageSize)

        .Take(pageSize)

        .ToListAsync();



    return Ok(data);

}

Enter fullscreen mode Exit fullscreen mode

使用ToListAsync确保分页数据检索高效且无阻塞。

大型数据集的分页

处理大型数据集时,需要注意性能。这里有一个小提示:务必为用于排序的数据库列建立索引。这可以显著加快查询速度。

高级分页技术

好了,让我们开始吧,深入研究一些高级的东西。自定义逻辑、服务器/客户端分页,甚至无限滚动。

自定义分页逻辑

自定义分页可能需要更多控制。例如,如果您想要唯一的页码编号、排序或筛选功能:


public PagedResult<T> GetPagedData<T>(IQueryable<T> query, int page, int pageSize) where T : class

{

    var result = new PagedResult<T>

    {

        CurrentPage = page,

        PageSize = pageSize,

        RowCount = query.Count()

    };



    var pageCount = (double)result.RowCount / pageSize;

    result.PageCount = (int)Math.Ceiling(pageCount);



    var skip = (page - 1) * pageSize;

    result.Results = query.Skip(skip).Take(pageSize).ToList();



    return result;

}

Enter fullscreen mode Exit fullscreen mode

这里PagedResult<T>是一个辅助类,封装了分页数据和元信息CurrentPage,如PageSize,,RowCount等。

服务器端与客户端分页

让我们分解一下:

  • 服务器端分页:从服务器逐页获取数据。适用于海量数据集。

  • 客户端分页:所有数据均预先加载,分页控制哪些部分可见。适用于小型数据集,以最大限度地减少服务器调用。

Csharp 中分页的性能考虑

为了提高分页效率:

  • 使用数据库索引。

  • 避免获取不必要的数据。

  • 如果数据不经常变化,则实施缓存。

无限滚动分页

你用过 Instagram 或 Twitter 吗?这就是无限滚动分页。以下是使用 C# 实现的方法:


public async Task<IActionResult> GetInfiniteScrollData(int lastItemId, int pageSize = 10)

{

    var data = await _context.DataEntities

        .Where(d => d.Id > lastItemId)

        .OrderBy(d => d.Id)

        .Take(pageSize)

        .ToListAsync();



    return Ok(data);

}

Enter fullscreen mode Exit fullscreen mode

在这个例子中,lastItemId表示最后加载项目的 ID。是不是很棒?

API 设计中的分页

设计支持分页的 API 可以显著提升应用程序的性能和可用性。请继续关注,我们将探索如何无缝地实现这一点。

设计分页 API 端点

在设计 API 时,您可以包含诸如page和之类的参数size来处理分页:


GET /api/data?page=1&size=10

Enter fullscreen mode Exit fullscreen mode

在 ASP.NET Web API 中实现分页

以下是 ASP.NET Web API 中的实际实现:


[HttpGet]

public async Task<IActionResult> GetPagedData(int pageNumber = 1, int pageSize = 10)

{

    var data = await _context.DataEntities

        .OrderBy(d => d.SomeProperty)

        .Skip((pageNumber - 1) * pageSize)

        .Take(pageSize)

        .ToListAsync();



    var totalRecords = await _context.DataEntities.CountAsync();

    var pagedData = new {

        TotalRecords = totalRecords,

        Data = data

    };



    return Ok(pagedData);

}

Enter fullscreen mode Exit fullscreen mode

此响应包括分页数据和总记录数,确保客户端知道有多少页。

使用 API 中的页面大小和限制

最好包含处理页面大小限制的逻辑,以防止对过大页面的请求:


int MaxPageSize = 50;

pageSize = (pageSize > MaxPageSize) ? MaxPageSize : pageSize;

Enter fullscreen mode Exit fullscreen mode

用户界面和用户体验考虑

分页不仅仅适用于后端。它在前端用户体验中扮演着重要的角色。让我们来谈谈如何让分页变得用户友好且无缝衔接!

设计用户友好的分页控件

以下是一些提示:

  • 使用易于理解的导航控件,例如“第一”、“上一个”、“下一个”和“最后一个”。

  • 显示当前页码和总页码。

  • 提供页面大小选项(例如,每页 10、20、50 个项目)。

为 Razor 页面添加分页功能

在 Razor Pages 中,添加分页非常简单。以下是分页视图的示例:


@page

@model PagedListModel



<table>

    <thead>

        <tr>

            <th>Item</th>

        </tr>

    </thead>

    <tbody>

        @foreach (var item in Model.Items)

        {

            <tr>

                <td>@item.Name</td>

            </tr>

        }

    </tbody>

</table>



<nav aria-label="Page navigation">

    <ul class="pagination">

        <li class="page-item">

            <a class="page-link" href="?page=@(Model.CurrentPage - 1)">Previous</a>

        </li>

        @for (int i = 1; i <= Model.TotalPages; i++)

        {

            <li class="page-item">

                <a class="page-link" href="?page=@i">@i</a>

            </li>

        }

        <li class="page-item">

            <a class="page-link" href="?page=@(Model.CurrentPage + 1)">Next</a>

        </li>

    </ul>

</nav>

Enter fullscreen mode Exit fullscreen mode

使用 JavaScript 和 AJAX 集成分页

使用 JavaScript 和 AJAX,您可以使页面转换更加流畅:


$(document).on('click', '.page-link', function(e) {

    e.preventDefault();

    var page = $(this).attr('href').split('page=')[1];



    $.ajax({

        url: '/api/data?page=' + page,

        type: 'GET',

        success: function(data) {

            // Update the table with new data

        }

    });

});

Enter fullscreen mode Exit fullscreen mode

此代码片段挂接到分页链接,捕获点击事件,并使用 AJAX 获取新数据。

测试和调试分页

即使是最好的代码也可能出现问题。让我们确保分页逻辑稳健且经过充分测试。

单元测试分页逻辑

单元测试确保您的分页逻辑按预期执行:


[TestMethod]

public void TestPagination()

{

    var data = Enumerable.Range(1, 100).ToList();

    var pagedData = Paginate(data, 2, 10);



    Assert.AreEqual(10, pagedData.Count());

    Assert.AreEqual(11, pagedData.First());

    Assert.AreEqual(20, pagedData.Last());

}

Enter fullscreen mode Exit fullscreen mode

常见问题和故障排除

常见的分页问题包括:

  • 页码计算不正确。

  • 偏差一错误。

  • 大型数据集的性能瓶颈。

性能测试分页

使用 JMeter 或 Postman 等工具对分页端点进行性能测试。确保它们能够高效地处理并发用户。

有效分页的最佳实践和技巧

让我们总结一些重要的最佳实践和技巧,以使您的分页达到一流水平。

分页内容的 SEO 注意事项

确保每个分页页面都可以被搜索引擎抓取:

  • 在 HTML 中使用rel="next"和链接rel="prev"<head>

  • 包含规范标签以避免重复内容问题。

高效的数据库分页查询

使用索引查询并TOP实现高效的数据检索:


var result = context.DataEntities

    .OrderBy(d => d.SomeProperty)

    .Skip((pageNumber - 1) * pageSize)

    .Take(pageSize)

    .ToList();

Enter fullscreen mode Exit fullscreen mode

使用缓存和索引来提高性能

缓存重复查询和索引经常搜索的列可以大大提高性能:

  • 利用MemoryCache或 Redis 进行缓存。

  • OrderBy对、、Where和子句中使用的数据库列进行索引Join

结论

我们介绍了分页的基础知识,探索了高级技术,并讨论了 API 设计和用户体验方面的考量。现在,您应该已经具备在 C# 应用程序中实现、优化和排除分页故障的能力。

记住,有效的分页不仅可以提升性能,还能极大地提升用户体验。祝你编码愉快!

鏂囩珷鏉ユ簮锛�https://dev.to/bytehide/pagination-in-c-complete-guide-with-easy-code-examples-3ma2
PREV
.NET 开发人员必须遵守的 10 条安全应用程序准则
NEXT
C# 中的 DataTable – 用法和示例