在ASP.NET Core Razor视图中添加分页时遇数据传递问题
嘿,我看你跟着官方教程做EF MVC分页,到把PaginatedList数据传给Razor视图这步卡壳了。先把你贴的代码片段补全并格式化(你原来的代码有拼写错误和截断),官方完整的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 count, int pageIndex, int pageSize) { PageIndex = pageIndex; TotalPages = (int)Math.Ceiling(count / (double)pageSize); this.AddRange(items); } public bool HasPreviousPage => PageIndex > 1; public bool HasNextPage => PageIndex < TotalPages; public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize) { var count = await source.CountAsync(); var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(); return new PaginatedList<T>(items, count, pageIndex, pageSize); } }
接下来给你列几个最容易踩坑的排查点,按顺序检查:
先确认PaginatedList类的完整性:你贴的代码明显没写完(比如
publi...是拼写错误+截断),如果类里缺了PageIndex、TotalPages这些核心属性,或者CreateAsync方法,视图里根本没法用分页逻辑,直接就会报编译错误。先把类补全到和官方一致。检查控制器传递数据的逻辑:确保你的Action是异步的,并且正确调用CreateAsync方法,最后把PaginatedList实例传给视图,而不是普通的List。举个例子:
public async Task<IActionResult> Index(int? pageIndex) { var pageSize = 3; var students = _context.Students.AsQueryable(); // 这里要确保返回的是PaginatedList实例,不是ToList()后的普通List var paginatedStudents = await PaginatedList<Student>.CreateAsync(students, pageIndex ?? 1, pageSize); return View(paginatedStudents); }核对Razor视图的模型声明:视图顶部必须正确指定模型类型为
PaginatedList<你的实体类>,比如:@model PaginatedList<ContosoUniversity.Models.Student>如果写成了
@model List<Student>,那视图里访问Model.HasPreviousPage这类分页属性肯定会报错,因为普通List根本没有这些属性。检查视图里的分页代码语法:比如分页按钮的逻辑要正确调用模型的属性,别拼错名字。比如官方示例里的分页按钮代码:
@if (Model.HasPreviousPage) { <a asp-action="Index" asp-route-pageIndex="@(Model.PageIndex - 1)">Previous</a> } @for (int i = 1; i <= Model.TotalPages; i++) { <a asp-action="Index" asp-route-pageIndex="@i">@i</a> } @if (Model.HasNextPage) { <a asp-action="Index" asp-route-pageIndex="@(Model.PageIndex + 1)">Next</a> }这里要注意PageIndex别写成PageNumber,HasPreviousPage别漏写s之类的拼写错误。
确认命名空间引用:不管是控制器还是视图,都要引用PaginatedList所在的命名空间。比如视图里要加
@using 你的项目.Models(如果PaginatedList在这个命名空间下),控制器里也要加对应的using语句,不然会找不到PaginatedList类型。
如果还是有问题,你可以把具体的错误信息(比如编译错误、运行时异常)贴出来,我再帮你定位。
内容的提问来源于stack exchange,提问作者Idev Dev

