如何在 ASP.NET 页面中跨更新面板刷新保留数据表?

问题描述 投票:0回答:1

我正在构建一个显示各种统计数据的网站,每个统计数据都来自各种大型 MySQL 表。运行查询、检索信息和我的代码需要几秒钟的时间才能将该信息格式化为漂亮的表格。我原来的程序只是将所有统计信息加载到一页中,但是随着越来越多的用户请求更多统计信息,页面加载时间变得越来越长,因此我决定将页面分解,只运行用户正在查找的表的查询为了。我设置了一个更新面板,其中包含多个用于表组的 asp:Panel 元素。

但是,每次用户单击某个部分的按钮时,都会运行对这些统计信息的查询并生成表格。如果用户转到另一个部分,然后返回到第一个部分,则第一个部分的查询将第二次运行。这似乎是因为,当第二部分运行并且刷新更新面板时,第一部分的数据被擦除。

是否有任何方法可以保留更新面板刷新时生成的数据,以便构建表的查询和子例程仅运行一次?例如,我想在用户单击第二部分时简单地“隐藏”第一部分,然后在用户单击第一个部分时显示第一个部分并隐藏第二个部分。

伪代码类似于:

Sub SectionOneButtonClick
   HideAllSections
   If section1 is empty
      generate section1
   End if
   ShowSection1
End Sub

Sub SectionTwoButtonClick
   HideAllSections
   If section2 is empty
      generate section2
   End if
   ShowSection2
End Sub
asp.net vb.net updatepanel
1个回答
0
投票

事实证明,在大多数情况下,“持久”数据的服务器负载所花费的成本几乎与重新运行查询一样多。

但是,我会考虑使用临时表。您可以在临时表名称前面加上用户 ID 或类似的前缀。

那么,当您的查询进行所有这些咀嚼和处理时?将摘要结果发送到临时表。然后,当他们返回时,您检查临时表并使用它 - 它应该很快。然而,既然网络世界是围绕无状态和断开连接的模型构建的呢?然后,您可能会考虑根据用户 ID 创建汇总表,因此甚至不使用或创建 SQL 临时表(问题在于 SQL Server 如何以及何时转储和处置这些表)。因此,要么创建一些汇总表,并包含一个包含用户 ID 的列。然后,您可以刷新或返回时检查该临时报告表中的行,从而提取这些汇总行。或者如上所述,根据当前用户 ID 创建表,然后对该数据进行重新查询几乎不需要任何成本。

我想在会话结束事件中,您可以考虑使用代码来删除表。然而,会话“结束”并不能可靠地触发。

这里的一些日期逻辑可以处理每个用户已知何时创建临时数据表的问题。事实上,这可能是另一个带有用户 ID 和数据生成的最后日期的表。

因此,我不会尝试将此类数据持久保存在内存中,而是使用 SQL Server 及其性能来实现此目的。这也往往会减小浏览器视图状态的大小,具体取决于您用于呈现数据的控件类型(例如 ListView 或 GridView)。

但是,说了以上所有内容之后呢?如果您为每个部分使用更新面板?那么,一个更新面板中的数据更新、更改或填充不应影响、导致或要求重新加载其他更新面板。

请记住,单击一个更新面板中放置的一个简单按钮将触发该页面上的所有更新面板。但是,如果您将更新面板模式设置为 UpdateMode="Conditional"。

此时,您可以在代码隐藏中隐藏或显示每个面板,并且您不需要重新加载或重新查询每个更新面板部分。他们应该能够保留他们的数据。我想这取决于您在每个面板内使用和渲染的控件类型? Asp.net 控件具有自动视图状态,因此 asp.net 控件将保留其数据 - 包括 GridView 或 ListView。

对于第 3 方控件,比如看起来很酷的仪表控件?然后,如果您只需要几个值,则可以将总计保留在隐藏字段中,然后使用客户端 JavaScript 为您的“自己的”视图状态系统重新加载这些值。

© www.soinside.com 2019 - 2024. All rights reserved.