我正在寻找一个ajax页面;这是一个报告页面。默认情况下,加载今天的报告。在页面上有一个日历控件,当用户点击日期时,使用相应的数据重新加载gridview。执行以下操作是否为良好做法:
1) on the first page load, query the data for the page
2) put the query result in the session object and display it in a gridview
3) if the user requests new data, get new data from the query with different parameters
4) put the result of the second query in the session object and display it
5) if the user then requests the data from the first query, get it from the session object
6) do the sorting and paging with the data held in the session.
注意:每个查询的数据将包含大约300-500行和大约15列。我想用ajax调用来做这一切。有哪些建议和缺陷需要避免。
感谢。
答案 0 :(得分:2)
由于您希望在Javascript Ajax场景中使用数据,因此最有意义的是创建HTTP Handler来查询并根据需要返回所需的数据结果集。
使用会话对象不是解决方案,因为无法异步访问它。因此,您的页面将无法查询此数据以反馈给您的Javascript对象(除非您创建了一个HTTP Handler来将其发回,但是当您可以直接在HTTP Handler中查询数据时,这将毫无意义)。
答案 1 :(得分:2)
我会使用Backbone.js:
以前查看日期的报告仍将在客户端作为Backbone Model实例,因此除非用户强制,否则无需从服务器重新加载。我相信这是你最关心的问题?
你可能仍然处于无需客户端框架的范围内,但是如果你打算做更多的这些页面或者变得更复杂,你可以很快就去意大利面类似Backbone.js。
PS。我刚才注意到这与.NET有关。我对.NET一无所知,所以也许有一个内置的客户端框架可以做类似的事情。
编辑(阅读评论后更新):
对于服务器端缓存,我认为数据库中的非规范化报表或单独的专用缓存存储(例如memcache)比会话对象更好。
但这取决于。如果有说,每个用户每天有1个可能的报告,并且你没有设置memcache,并且你不想出于任何原因使用数据库,那么将它存储在会话中是有意义的宾语。但是,如果每天的报告对所有用户都是相同的,那么您现在将其缓存N次而不是1.也可能很难从外部钩子中失效,并且用户在注销时会丢失缓存。
所以我可能只是有一个典型的get-or-set模式来尝试首先从缓存加载报告,然后回退到DB。然后,仅在用户强制执行时,或者用于创建报表的数据已更改时,才会使缓存的报表无效/更新。 AJAX呼叫按日期请求报告,或者确定报告。
答案 2 :(得分:1)
你忘记了窗户。客户端不是窗口,客户端是浏览器,它可以包含许多窗口/选项卡。您需要确保渲染/馈送正确的窗口。通常我通过提交隐藏值来处理这个问题。
问题在于分离恢复会话/开始新窗口。
答案 3 :(得分:0)
我不打算在会话中持有多个查询副本。您希望在Session中保留它的主要原因是大概提高排序/分页速度。用户期望它们相对较快,但选择新日期可能会更慢。另外,他们真正重新加载第一个查询的可能性是什么?
其他答案通常会在Session中存储时会产生很大的陷阱。