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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:55:15