在 ASP.NET MVC 中可视化由多个条件驱动的列表时,最佳实践实现是什么?
换句话说,我正在想象一个非常大的项目列表。因此 - 我已经实现了(通用)分页,效果很好。不过,我还有一个可选的搜索表单,它可以根据多个条件过滤项目。我将如何实现保留搜索条件的分页?显而易见的答案是使用路由,但是,我不想在 URL 中传递 10-20 个不同的参数。我的选择是什么?表格发布?
TL;博士; - 具有多个过滤条件的分页,无需为每个过滤器创建路由。
我建议您远离路由,因为这会很快演变成无法测试的头痛。使用 POST 可能也不明智,因为它对用户不太友好,因为他们无法按预期为 URL 添加书签或使用后退按钮(无需重新发布)。最好的方法是像你提到的那样将 GET 与查询字符串一起使用。
为了避免巨大的 URL(这通常不应该成为问题,因为 URL 通常最多可达 2,000 个字符),您可以使用默认和空的过滤器值来发挥您的优势。创建和传递过滤器值时,只需忽略包含默认值或空值的值并在代码中隐式设置它们即可。这将消除您的 URL 中的许多空参数,例如
example.com/?query=somestring&p1=&p2=&p3=&p4=
并将其减少为 example.com/?query=somestring
。
另一个随机的建议,确保创建一个正确的 ViewModel 来包含与过滤和分页参数及其默认值相关的所有逻辑,并将其作为 HttpGet 操作方法中的参数传递。
对于基于许多动态过滤器的过滤列表,我更喜欢使用 oData。有些人会说这是一个有漏洞的抽象(这是事实),但在这样的情况下它确实很方便,在这种情况下,您希望能够返回过滤和分页的结果,并且这些过滤器可能很复杂,也可能随着时间的推移而改变。
所有实际的过滤器生成都是在客户端使用非常少的服务器端代码完成的。您可以通过端点公开 IQueryable,并对方法进行一些限制,例如最大返回结果或授权检查,并将构建过滤器的逻辑和行为放入客户端代码中。
查看示例时请记住,您不必实现其他组件,例如更新、删除、创建。