【发布时间】:2013-06-28 05:32:18
【问题描述】:
在我们的 Web 应用程序中,我们有一些非常慢的数据密集型 UI 页面,而我们现在使用的客户端排序和过滤会强制这些页面从 API 加载所有数据(以 JSON 格式)和然后在浏览器中执行操作,这通常意味着页面在准备好使用之前会冻结几秒钟。 我们正在研究的解决方案是提供支持过滤和排序的服务器端分页。
对于分页,我们在 URL 中发送 pageIndex 和 pageSize 参数,它工作正常。现在对于排序(和过滤),我们正在考虑发送属性的名称以在 JSON 对象中进行排序(和过滤),该 JSON 对象可以由 API 解析以生成正确的数据查询。我在这里遇到的问题是,为了使事情尽可能简单和快速,UI 页面必须“知道”他们想要对数据进行排序(或过滤)数据的数据列名称,这是不可取的。
例如,API 在名为“FN”的属性中(在 JSON 对象中)发送用户名;但是,要让 API 按名字对用户进行排序,UI 必须发送“FirstName”作为排序属性,这是我数据库中列的名称。这种方法允许我将属性的名称直接传递给我的数据层并快速完成工作。然而,用户界面需要识别数据库中数据表的列名,这几乎破坏了在层之间分离关注点的整个想法(这是我们将 Web 应用程序分解为单独的 API 和用户界面)。
有没有一种干净的方法来为服务器端分页提供过滤和排序,而不会在 UI 和后端之间创建这种依赖关系?
谢谢你。
【问题讨论】:
-
这不是你自己造成的问题吗? - 为什么 UI“必须”发送“FirstName”而不是使用您的 API 已经发送给它的相同标识符(例如
FN)? -
像我说的那样传递“名字”是最简单的事情。我可以发送“FN”,但随后我必须添加一些内容以将其翻译为“FirstName”以生成合适的查询。我知道这个解决方案,但我正在尝试找出是否有更好的做法或工具来完成这项工作。
-
翻译名称的开销可能会被实际访问数据和执行排序和过滤所产生的开销所淹没。跨度>
-
谢谢@Damien_The_Unbeliever。我将等待更多的答案,但我认为这是最合理的方法。您能否将您的 cmets 设为答案,以便我在最终使用它时将其标记为解决方案?
标签: c# asp.net web-services rest asp.net-web-api