ASP.NET Core多模型视图下PaginatedList分页功能失效如何解决
报错原因
你当前的用法存在类型不匹配问题:PaginatedList<T>本身是继承自List<T>的泛型集合类,相当于自带分页参数的列表。你将视图模型指定为PaginatedList<CustomerInventoryCollectionDataModel>,意味着整个Model是多个组合模型对象组成的列表,列表本身自然没有单个组合模型里的CustomerData和Inventorys属性,因此触发了属性找不到的报错。
同时你的需求是仅对Inventorys集合做分页,不需要对整个组合模型做分页,因此正确的做法是将分页对象放到组合模型内部。
改造步骤
1. 调整组合模型定义
把原来的List<Inventory>替换为PaginatedList<Inventory>,专门承载分页后的库存数据,保留单个客户数据字段:
public class CustomerInventoryCollectionDataModel { public Customer CustomerData { get; set; } // 用PaginatedList替代List,承载分页后的库存数据和分页参数 public PaginatedList<Inventory> PaginatedInventories { get; set; } }
2. 控制器端组装视图模型
先查询单个客户数据,再针对Inventory数据源调用CreateAsync方法生成分页结果,最后组装为组合模型传给视图:
public async Task<IActionResult> Index(int pageIndex = 1, int pageSize = 10) { // 替换为你实际的客户查询逻辑 var customer = await _context.Customers.FirstOrDefaultAsync(c => c.Id == 你的客户ID); // 构建Inventory的查询源,可根据需求加筛选、排序条件 var inventoryQuery = _context.Inventories.Where(i => i.CustomerId == 你的客户ID).AsNoTracking(); // 生成分页后的Inventory集合 var paginatedInventories = await PaginatedList<Inventory>.CreateAsync(inventoryQuery, pageIndex, pageSize); // 组装组合模型 var viewModel = new CustomerInventoryCollectionDataModel { CustomerData = customer, PaginatedInventories = paginatedInventories }; return View(viewModel); }
3. 调整视图绑定逻辑
视图直接绑定组合模型,不需要外层套PaginatedList,分页相关参数从PaginatedInventories属性获取即可:
@model JAXApp.Models.CustomerInventoryCollectionDataModel <div> <h4>Customer</h4> <hr /> <dl class="row"> <dt class="col-sm-2"> Customer Number </dt> <dd class="col-sm-10"> @Html.DisplayFor(model => model.CustomerData.CustomerNumber) </dd> </dl> <table class="table"> <thead>...</thead> <tbody> @foreach (var item in Model.PaginatedInventories) { <!-- 渲染单条Inventory数据 --> } </tbody> </table> <!-- 分页控件,和官方文档用法一致,仅从PaginatedInventories属性取参数 --> <a asp-action="Index" asp-route-pageIndex="@(Model.PaginatedInventories.HasPreviousPage ? Model.PaginatedInventories.PageIndex - 1 : 1)" class="btn btn-primary @(Model.PaginatedInventories.HasPreviousPage ? "" : "disabled")"> 上一页 </a> <span>第 @Model.PaginatedInventories.PageIndex 页 / 共 @Model.PaginatedInventories.TotalPages 页</span> <a asp-action="Index" asp-route-pageIndex="@(Model.PaginatedInventories.HasNextPage ? Model.PaginatedInventories.PageIndex + 1 : Model.PaginatedInventories.TotalPages)" class="btn btn-primary @(Model.PaginatedInventories.HasNextPage ? "" : "disabled")"> 下一页 </a>
内容的提问来源于stack exchange,提问作者trx
相关产品推荐
相关产品推荐

