.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参数是否正确接收到2Skip((2-1)*5)是否正确跳过前5条数据- 查询返回的
paginatedData是否包含第6条记录 - 总记录数
totalCount是否大于等于6,确保HasNextPage为true
内容的提问来源于stack exchange,提问作者Mayank Srivastava
相关产品推荐
相关产品推荐

