程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

C# 中的分页:带有简单代码示例的完整指南

balukai 2025-01-12 11:28:53 文章精选 16 ℃
  1. C# 分页简介
  2. 在 C# 中实现分页
  3. 高级分页技术
  4. API 设计中的分页
  5. 用户界面和用户体验注意事项
  6. 测试和调试分页
  7. 有效分页的最佳实践和技巧
  8. 结论

C# 分页简介

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

什么是分页?

分页是一种将大型数据集拆分成更小、更易于管理的块或页面的技术。可以将其想象成阅读一本书 - 您不是一次看完整本书,而是一次阅读一页。

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

分页通过一次仅加载部分数据来帮助改善用户体验。它减少了加载时间,减少了服务器压力,并使用户更轻松地浏览数据。

分页的常见场景

  • 电子商务商店的产品列表
  • 从数据库搜索结果
  • 在管理面板中显示日志条目

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

在 C# 中实现分页

让我们从 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();

在此代码片段中:

  • 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();

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

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);
}

就这样,您的 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);
}

使用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;
}

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

服务器端与客户端分页

让我们分解一下:

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

无限滚动分页

曾经使用过 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);
}

在此示例中,lastItemId表示最后加载项目的 ID。很棒,对吧?

API 设计中的分页

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

设计分页 API 端点

在设计 API 时,您可以包含如下参数pagesize处理分页:

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

在 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);
}

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

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

包含处理页面大小限制的逻辑是一个好主意,可以防止对过大页面的请求:

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

用户界面和用户体验注意事项

分页不仅仅与后端有关。它在前端用户体验中起着重要作用。让我们来谈谈如何让分页变得用户友好且无缝!

设计用户友好的分页控件

以下是一些提示:

  • 使用易于理解的导航控件,如“第一”、“上一个”、“下一个”和“最后一个”。
  • 显示当前页数和总页数。
  • 提供页面大小选项(例如每页 10、20、50 个项目)。

为 Razor Pages 添加分页功能

在 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>

使用 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
        }
    });
});

此代码片段挂接到分页链接,捕获点击事件,并使用 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());
}

常见问题和疑难解答

常见的分页问题包括:

  • 页码计算不正确。
  • 一次错误。
  • 大型数据集的性能瓶颈。

性能测试分页

使用 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();

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

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

  • 利用MemoryCache或 Redis 进行缓存。
  • OrderByWhere和子句中使用的数据库列进行索引Join

结论

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

请记住,有效的分页不仅可以提高性能,还可以大大改善用户体验。

祝您编码愉快!

最近发表
标签列表