You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core MVC 6.0分页功能异常:点击下一页无数据显示

问题排查与解决方案

1. 修正请求方法与参数绑定

分页属于数据查询操作,不建议用HttpPost处理,改用HttpGet更符合REST规范,且能自动绑定URL中的pageNumber参数。如果必须保留HttpPost,需显式指定参数从Query绑定:

错误示例(HttpPost未绑定Query参数):

[HttpPost]
public IActionResult Show(int pageNumber = 1)
{
    // 分页逻辑
}

修正方案1:改为HttpGet

[HttpGet]
public IActionResult Show(int pageNumber = 1)
{
    int pageSize = 5; // 对应第6条数据在第2页
    var query = _dbContext.YourEntities.AsQueryable();
    var totalCount = query.Count();
    var paginatedData = query.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
    
    var paginatedList = new PaginatedList<YourEntity>(paginatedData, totalCount, pageNumber, pageSize);
    return View(paginatedList);
}

修正方案2:保留HttpPost并绑定Query参数

[HttpPost]
public IActionResult Show([FromQuery]int pageNumber = 1)
{
    // 同上分页逻辑
}

2. 检查PaginatedList类实现

确保分页类的核心逻辑无错误,重点验证总记录数计算、分页偏移量:

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

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

    public bool HasPreviousPage => PageIndex > 1;
    public bool HasNextPage => PageIndex < TotalPages;

    // 异步创建方法(若使用EF Core异步查询)
    public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
    {
        var totalCount = await source.CountAsync();
        var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
        return new PaginatedList<T>(items, totalCount, pageIndex, pageSize);
    }
}

需确认:

  • 总记录数totalCount来自未分页的原始查询,而非分页后的数据条数
  • 分页偏移量(pageIndex - 1) * pageSize计算正确(避免跳过错误条数)

3. 视图分页按钮的请求正确性

确保视图中分页按钮的请求方式与控制器方法匹配:

GET请求分页按钮示例(Razor视图):

@model PaginatedList<YourEntity>

<div class="pagination">
    @if (Model.HasPreviousPage)
    {
        <a asp-action="Show" asp-route-pageNumber="@(Model.PageIndex - 1)" class="btn btn-sm btn-secondary">上一页</a>
    }
    @if (Model.HasNextPage)
    {
        <a asp-action="Show" asp-route-pageNumber="@(Model.PageIndex + 1)" class="btn btn-sm btn-secondary">下一页</a>
    }
</div>

Post请求分页按钮示例(需通过表单传递参数):

@model PaginatedList<YourEntity>

@if (Model.HasNextPage)
{
    <form asp-action="Show" method="post">
        <input type="hidden" name="pageNumber" value="@(Model.PageIndex + 1)" />
        <button type="submit" class="btn btn-sm btn-secondary">下一页</button>
    </form>
}

4. 验证数据查询逻辑

在控制器方法中添加断点或日志,确认:

  • pageNumber参数是否正确接收到2
  • Skip((2-1)*5)是否正确跳过前5条数据
  • 查询返回的paginatedData是否包含第6条记录
  • 总记录数totalCount是否大于等于6,确保HasNextPage为true

内容的提问来源于stack exchange,提问作者Mayank Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:02:13