ASP.NET MVC 分页,当你有多个条件时

ASP.NET MVC paging, when you have multiple criteria

在 ASP.NET MVC 中可视化由多个条件驱动的列表时,最佳实践实施是什么?

换句话说 - 我正在可视化一个非常大的项目列表。因此-我已经实现了(通用的)分页,效果很好。但是,我还有一个可选的搜索表单,它可以根据多个条件过滤项目。我将如何实施保留搜索条件的分页?显而易见的答案是路由,但是,我不想在 URL 中传递 10-20 个不同的参数。我有什么选择?表单发布?

TL;DR; - 具有多个过滤条件的分页,无需为每个过滤器创建路由。

我建议您远离路由,因为它会很快演变成一个无法测试的令人头疼的问题。使用 POST 可能也不明智,因为它不是非常用户友好,因为他们不能按预期为 URL 添加书签或使用后退按钮(不重新发布)。最好的方法是像您提到的那样将 GET 与查询字符串一起使用。

为避免使用巨大的 URL(这通常不会成为问题,因为 URL 通常最多可达 2,000 个字符),您可以只使用默认值和空过滤器值以发挥优势。创建和传递过滤器值时,只需忽略包含默认值或空值的值,并在您的代码中隐式设置它们。这将使您的网址摆脱许多空参数,例如 example.com/?query=somestring&p1=&p2=&p3=&p4= 并将其减少为 example.com/?query=somestring.

另一条随机建议,请确保您创建了一个适当的 ViewModel 以包含与过滤器和分页参数及其默认值有关的所有逻辑,并将其作为参数传递到您的 HttpGet 操作方法中。

对于基于许多动态过滤器的过滤列表,我更喜欢使用 oData。有人会说这是一个有漏洞的抽象(这是真的),但在这种情况下它确实派上用场,在这种情况下,您希望能够 return 过滤和分页结果,并且这些过滤器可能很复杂,也可能会发生变化随着时间的推移。

所有实际的过滤器生成都是在客户端完成的,服务器端代码非常少。您可以通过端点公开一个 IQueryable,对方法有一些限制,例如最大 returned 结果或授权检查,并将构建过滤器的逻辑和行为放在客户端代码中。

查看示例时请记住,您不必实施其他组件,如更新、删除、创建。

See this for Web API 2.2 + oData v4.0 example