【发布时间】:2016-09-22 02:59:30
【问题描述】:
在基于 ViewModel 的 MVC 应用程序中实现分页时,我遇到了排序问题。
我的代码与我之前发布的关于此应用程序的问题基本保持不变(除了那个特定的、已实施的修复)。
我的代码:
MVC 5 EF 6 - How to Search a Table Using Related Table Object Criteria
发生的情况是,在注释掉默认排序情况后,分页将按预期运行,但仅当“sortOrder”参数中未指定默认排序顺序时。结果将类似于:
它显示 x 的第 1 页,我可以很好地浏览这些页面。但是,当我尝试排序时,第一页以外的所有记录都会丢失:
页面下降到 1,该页面上的记录现在全部存在。如果我将分页更改为每页显示 50 条记录,那么在我排序后,总共只有 50 条记录,在 1900 条左右。如果我将其更改为 20,则只有 20 条记录,以此类推。
问题似乎与这部分代码中指定的排序有关:
switch (sortOrder)
{
case "PONumber_desc":
viewModel.PORequests = viewModel.PORequests.OrderByDescending(s => s.PONumber).ToPagedList(pageNumber, 5);
break;
case "AppropNumber":
viewModel.PORequests = viewModel.PORequests.OrderBy(s => s.AppropNumber).ToPagedList(pageNumber, 5);
break;
如果我评论该代码或避免排序,它会起作用。排序确实适用于那里的记录。如果我禁用分页并保留排序代码,它也会正常运行。当我同时使用分页和排序功能时,我的记录被“修剪”了。
这个问题似乎与我正在使用带有相关表的 ViewModel 的事实有关。否则,我在教程和我自己的应用程序中都取得了成功。
如何在不破坏分页和搜索或更改 ViewModel 方法的情况下成功对记录进行排序?我只是把这一切都错了吗?
更新
感谢您的回复。我尝试按照您的建议构建它(以及以前使用 IEnumerable 而不是 IQueryable 的类似方式),但我收到类似
的错误错误 CS1061“IQueryable”不包含“PageCount”的定义,并且没有扩展方法“PageCount”接受“IQueryable”类型的第一个参数
如果它有所作为,在 ViewModel 中使用 PagedList.IPagedList 是在我用作指导的教程中实现的:
他们方便地为分页示例留下排序,并切换到应用程序的不同部分进行排序。
我尝试将您的代码放置到位,但在“viewModel.PORequests = query.ToPagedList(pageNumber, 5);”上我得到了错误:
无法从“PagedList.IPagedList”转换为“System.Linq.IQueryable”
此人有类似问题,但使用教程中的代码解决了该问题,该代码不适用于排序。
此人遇到了类似的问题,但使用静态分页列表解决了该问题。他的 sn-p 中的大部分代码都超出了我的想象。
任何进一步的帮助将不胜感激。
【问题讨论】:
-
显示完整代码和查看代码我想那么我们可以提供帮助
-
查看链接的问题,
viewModel.PORequests已经包含分页数据,所以上面的代码显然总是一页。您应该对可查询的源应用所有过滤/排序,并在最终查询中调用ToPagedList, -
@teo-van-kot 我试图参考,而不是重新发布代码,因为问题指南警告不要冗长。如果有帮助,我会把它带来。
标签: c# asp.net-mvc entity-framework sorting pagination