ASP.NET Core MVC:如何将分页参数TotalRecords、PageNo、PageSize绑定到视图
在ASP.NET Core MVC中实现表格分页并绑定分页参数
要解决控制器中TotalRecords、PageNo和PageSize绑定到视图的问题,核心是用ViewModel整合数据与分页信息——原视图模型仅传递了数据列表,无法承载分页参数。具体步骤如下:
1. 创建分页视图模型
定义一个ViewModel类,同时包含数据列表和分页相关属性:
public class MyDataViewModel { // 分页后的数据列表 public List<MyModel> DataList { get; set; } // 总记录数 public int TotalRecords { get; set; } // 当前页码 public int PageNo { get; set; } // 每页条数 public int PageSize { get; set; } }
2. 修改控制器代码
调整控制器逻辑,计算分页参数并封装到ViewModel中返回给视图,同时修正原代码中不必要的异步操作(Count()、Skip()、Take()均为同步方法,无需async):
// 展示数据并处理分页 public async Task<IActionResult> DisplayData(int p = 1, int s = 20) { try { IQueryable<MyModel> query = await _services.GetData(); // 计算总记录数 int totalRecords = query.Count(); // 执行分页查询 List<MyModel> paginatedData = await query.Skip((p - 1) * s) .Take(s) .AsNoTracking() .ToListAsync(); // 封装视图模型 var viewModel = new MyDataViewModel { DataList = paginatedData, TotalRecords = totalRecords, PageNo = p, PageSize = s }; return View(viewModel); } catch { // 异常时返回空数据的视图模型 return View(new MyDataViewModel { DataList = new List<MyModel>() }); } }
如果想保留独立的分页逻辑方法,可重构为同步方法:
// 独立的分页处理方法 private (IQueryable<MyModel> PaginatedQuery, int TotalRecords) ProcessPaging(int pageNo, int pageSize, IQueryable<MyModel> query) { int total = query.Count(); var paginated = query.Skip((pageNo - 1) * pageSize).Take(pageSize); return (paginated, total); }
在控制器中调用该方法:
var (paginatedQuery, totalRecords) = ProcessPaging(p, s, query); List<MyModel> paginatedData = await paginatedQuery.AsNoTracking().ToListAsync();
3. 修改视图代码
将视图模型改为MyDataViewModel,直接绑定分页组件的参数:
@model MyDataViewModel <table> @foreach (var item in Model.DataList) { <tr> <!-- 根据你的MyModel字段渲染内容,示例: --> <td>@item.Id</td> <td>@item.Name</td> <!-- 其他字段 --> </tr> } </table> <!-- 绑定分页参数到组件 --> <paging total-records="Model.TotalRecords" page-no="Model.PageNo" page-size="Model.PageSize" show-prev-next="false" show-first-last="false"> </paging>
关键说明
MVC视图只能直接访问传递给它的模型属性,原代码中控制器的TotalRecords、PageNo是私有字段,视图无法直接访问。通过ViewModel整合数据和分页参数,就能让视图轻松获取分页所需的所有参数,实现和Razor Pages类似的绑定效果。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

