2010-09-13 153 views
2

我有一个按钮onclick它应该去另一个页面包含jqGrid ..但如果用户想要去看看数据,它应该被缓存和显示,而不是打电话给服务器.. ..表单值默认缓存但jqGrid ...如何缓存它?jqGrid缓存网格数据

回答

1

数据的缓存可以实现,但并不容易。您必须在服务器端定义一些基于caching strategy选择的HTTP标头。例如可以使用“缓存控制” HTTP报头的max-age

Cache-Control: max-age=60 

,这意味着,该服务器响应在客户机上60秒期间被缓存。如果您打算使用此功能,则必须定义jqGrid的附加参数prmNames:{nd:null},该参数将删除发送nd参数以及任何服务器请求中包含的时间戳。完成这些步骤后,jqGrid使用的所有ajax请求将在时间间隔(60秒)内从本地缓存中获取。

对于ETags(实体标签),可能实施服务器端缓存策略更复杂,因为固定缓存时间是可能的。这是我最喜欢的策略,但其实现相对复杂(有关详细信息,请参见Guidance on a better way to retain filtering options when using ASP.NET MVC 2Concurrency handling of Sql transactrion)。

如果数据的缓存,你将无法使用(因为一些原因)我建议你如下两种变体的替代方式:

  1. 在同一页面上创建网格作为定义jqGrid参数的形式的按钮和其他过滤器(请参阅How to filter the jqGrid data NOT using the built in search/filter box)。
  2. “请用jQuery.Remove()jQuery.Empty()和新的ajax请求的格式”重新绘制“页面。例如jQuery("body").Empty()jQuery("div#main").Empty()其中<div id="main">位于身体的顶部。然后你可以用jQuery("body").load("newPage.htm")jQuery("div#main").load("newPage.jsp")这样的呼叫来填充页面正文(或ID为“main”的div)。

这些替代方案的优点是您将停留在同一页面并且可以使用所有JavaScript数据。例如,如果网格使用“loadonce:true”参数,然后使用数据值作为新的jqGrid的“数据”参数创建新的jqGrid,则可以从“data”参数获取旧的jqGrid数据。

+0

我不确定OP是否使用JSON,但如果他是,则有一种方法可以缓存原始JSON数据。他可以将缓存的数据传递给那个会填满网格的新页面吗?我只是想知道你怎么看待这样的事情?我不知道是否有可能... – webdad3 2010-09-15 23:22:02

+0

@Jeff V:我回答了很多** paul **的问题,并且知道他使用JSON,但是我写的所有内容对于任何ajax请求都是正确的('datatype :例如“xml”)。如果来自服务器的第一个响应在HTTP标头中包含“Cache-Control:max-age = 60',则来自同一浏览器的所有请求和来自任何其他页面的**的所有请求将从本地缓存中获取,而不发送任何请求到服务器。你必须像我写的那样使用'prmNames:{nd:null}'。所以这种方式工作。我花了很多天来实现'ETag'缓存,并在不同的浏览器中测试了这一点。所有人都这样做。所以缓存将工作 – Oleg 2010-09-15 23:35:57

+0

您的实现看起来很复杂,但我会尝试实现...只是想知道是否有任何性能问题,如果我将缓存像5000-6000记录?是啊我使用loadonce:真正的本地排序,过滤 – paul 2010-09-16 04:03:37

1

表单是HTML规范的一部分,jqGrid不是......你为什么期望网格的数据被缓存?这就是说,如果使用GET url来检索网格的数据,某些浏览器(如IE)会缓存GET的结果。您需要使URL唯一(例如,通过附加时间戳)以防止数据被缓存。但请记住,这不会缓存所有浏览器中的数据。

+0

以及这是我对页面的要求...说我有一个库存页面和交易历史页面..现在当用户想要查看库存中有什么数据时,他/她只需点击按钮并看到它。 ..我不想打太多的服务器调用,因为它的价格昂贵,而不是如果最后查看的页面可以缓存,比它将解决问题...我不确定它是否可能与jqGrid ...谢谢!虽然 – paul 2010-09-14 03:11:30