【问题标题】:MVC 5 EF 6 ViewModel (Page, Sort, Search) - Sorting Limits Paged Record ResultsMVC 5 EF 6 ViewModel (Page, Sort, Search) - 排序限制分页记录结果
【发布时间】: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 是在我用作指导的教程中实现的:

ASP EF MVC Tutorial

他们方便地为分页示例留下排序,并切换到应用程序的不同部分进行排序。

我尝试将您的代码放置到位,但在“viewModel.PORequests = query.ToPagedList(pageNumber, 5);”上我得到了错误:

无法从“PagedList.IPagedList”转换为“System.Linq.IQueryable”

此人有类似问题,但使用教程中的代码解决了该问题,该代码不适用于排序。

Similar Issue 1

此人遇到了类似的问题,但使用静态分页列表解决了该问题。他的 sn-p 中的大部分代码都超出了我的想象。

Similar Issue 2

任何进一步的帮助将不胜感激。

【问题讨论】:

  • 显示完整代码和查看代码我想那么我们可以提供帮助
  • 查看链接的问题,viewModel.PORequests 已经包含分页数据,所以上面的代码显然总是一页。您应该对可查询的源应用所有过滤/排序,并在最终查询中调用ToPagedList
  • @teo-van-kot 我试图参考,而不是重新发布代码,因为问题指南警告不要冗长。如果有帮助,我会把它带来。

标签: c# asp.net-mvc entity-framework sorting pagination


【解决方案1】:

在第一步中,您将ToPagedList(pageNumber, 5) 分配给viewModel.PORequests。由于在接下来的步骤中您将使用该变量作为源并再次应用相同的ToPagedList,显然结果是单个页面。

您应该做的是使用变量动态构建查询并在最终查询上调用ToPagedList,如下所示:

// Base query
var query = db.PORequests
           .Include(i => i.POItems)
           .AsQueryable();
// Filter
if (!string.IsNullOrEmpty(poNumber))
{
    query = query.Where(s => s.PONumber.Contains(poNumber));
}
if (!string.IsNullOrEmpty(AppropNumber))
{
    query = query.Where(x => x.AppropNumber.Contains(AppropNumber));
}
if (!string.IsNullOrEmpty(ContractNumber))
{
    query = query.Where(x => x.ContractNumber.Contains(ContractNumber));
}
if (!string.IsNullOrEmpty(ItemDescription))
{
   query = query.Where(x => x.POItems.Any(i => i.Description.Contains(ItemDescription)));
}
// Sort
switch (sortOrder)
{
    case "PONumber_desc":
        query = query.OrderByDescending(s => s.PONumber);
        break;
    case "AppropNumber":
        query = query.OrderBy(s => s.AppropNumber);
        break;
    case "AppropNumber_desc":
        query = query.OrderByDescending(s => s.AppropNumber);
        break;
    case "ContractNumber":
        query = query.OrderBy(s => s.ContractNumber);
        break;
    case "ContractNumber_desc":
        query = query.OrderByDescending(s => s.ContractNumber);
        break;
    default: 
        query = query.OrderBy(s => s.PONumber);
        break;
}
// Final paginated result
viewModel.PORequests = query.ToPagedList(pageNumber, 5);

【讨论】:

  • 感谢您的回复。使用您的代码后,我更新了我的问题。我可能需要进一步说明如何将我的代码的“IQueryable”版本放入分页列表中。
  • 你不应该得到 Cannot convert from 'PagedList.IPagedList' to 'System.Linq.IQueryable' 因为query 变量应该已经是IQueryable。确保从答案中复制/粘贴整个确切的 sn-p。请注意,我从您的原始代码中删除了很多 ToPagedList 调用,包括最初的调用。 sn-p 应该替换 var viewModel = new POItemData(); 之后的所有内容,除了 return View(viewModel);
  • 我按原样删除了代码。这是它当前的迭代:Current Version 我尝试将模型更改为 IEnumerable,这将 PagedList 取出到 IQueryable 错误,但留下了这些错误:'IQueryable' 不包含'PageCount''IQueryable 的定义' 不包含 'PageNumber' 的定义
  • 哇,完全没有必要更改您的 POItemData 课程。它应该保持为here
  • 因此将模型设置回 PagedList.IPagedList 可以使用您的代码(再次感谢)。那么毕竟,问题是使用'viewModel.PORequests'?我不明白为什么使用“查询”然后设置viewModel.PORequests = query.ToPagedList(pageNumber, 5); 有效,但仅使用“viewModel.PORequests”代替“查询”不起作用。他们有什么不同的引用方式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2015-04-20
  • 1970-01-01
  • 2015-05-30
  • 2016-10-10
  • 1970-01-01
相关资源
最近更新 更多