如何在ASP.NET Core MVC异步方法中实现分页功能?
问题分析与修复方案
你的代码存在两个核心问题,导致分页功能失效并出现空白页面:
1. 控制器未正确赋值分页结果
ToPagedList方法不会原地修改原集合,而是返回一个新的分页集合实例。你当前的代码只是调用了方法,但没有将结果赋值回viewModel.StudentCards,导致视图拿到的还是完整的原始集合,分页逻辑根本没生效。另外,异步场景下建议使用异步版本的分页方法避免同步阻塞。
修正后的控制器代码:
public async Task<IActionResult> StudentList(int? page) { StudentCardViewModel viewModel = await _mediator.Send(new GetCardQuery()); var pageNumber = page ?? 1; // 接收分页结果并赋值回ViewModel viewModel.StudentCards = await viewModel.StudentCards.ToPagedListAsync(pageNumber, 3); return View(viewModel); }
注意:需要确保你的
StudentCardViewModel中StudentCards的类型定义为IPagedList<StudentCard>(而非普通的List<StudentCard>),这样才能接收分页后的集合。
2. 视图中分页Pager调用参数错误
@Html.PagedListPager的第一个参数需要传入分页后的集合实例,而不是ViewModel的类型。同时要引入PagedList的命名空间才能使用分页辅助方法。
修正后的视图代码:
@using School.Application.ViewModels.Student @using X.PagedList.Mvc.Core // 引入分页命名空间 @model StudentCardViewModel <div class="Content"> <div> @foreach (var item in Model.StudentCards) { <div class="item"> <a class="title" target="_blank" href="@item.RedirectUrl">@item.Header</a> <div>@item.ShortDescription</div> <div class="readMore"><a target="_blank" href="@item.RedirectUrl">read more<span></span></a></div> </div> } </div> <!-- 传入分页后的集合,而非类型 --> @Html.PagedListPager(Model.StudentCards, page => Url.Action("StudentList", new { page })) </div>
额外检查项
- 确认已正确安装
PagedList.Core和PagedList.Core.MvcNuGet包,版本与你的ASP.NET Core版本兼容。 - 如果
GetCardQuery返回的是大量数据,建议在查询数据库时就进行分页(比如EF Core的Skip和Take),而不是先获取全部数据再内存分页,避免性能问题。
内容的提问来源于stack exchange,提问作者i13k32
相关产品推荐
相关产品推荐

