如何在不使用ViewState的情况下自定义ASP.NET控件缓存数据?

时间:2009-02-24 20:29:36

标签: asp.net optimization viewstate web-controls

我不确定这是否可以在ASP.NET中使用,但这是我遇到的问题:我的Web应用程序中的一些数据列表使用GridView显示;但是,因为其中一些列表可能包含大量数据,所以由于ViewState,它们有时会将页面权重推到几兆字节范围内。由于每次页面上都有回发时我们不想重新查询数据库,我想知道是否有一种方法可以将给予控件的数据缓存到服务器上,然后在下次访问它时有一个回发。

这甚至可能吗?如果是这样,有人能指出我更多关于如何做到这一点的信息吗?如果不可能,有没有人对我如何能够解决这个问题有任何建议?

4 个答案:

答案 0 :(得分:3)

除了页面之外,您还可以为视图状态使用不同的商店。 This Article描述了执行此操作的一些方法。

这样做的要点是覆盖SavePageStateToPersistenceMedium和LoadPageStateFromPersistenceMedium。

答案 1 :(得分:2)

您可以尝试在GridView上关闭ViewState。这通常可以在不影响功能的情况下完成。如果您的GridView仅显示数据并且不允许编辑,更新,删除等,则可以正常工作。

http://www.pluralsight.com/main/screencasts/screencast.aspx?id=understanding-viewstate

EnableViewState="false"

通常,您必须在客户端上的ViewState和服务器上的某种类型的缓存之间创建平衡。不要害怕重新查询数据库。它可以很好地缓存数据。可能会看一下启用页面缓存。我会避免将所有数据填充到Session中,这会带来一系列问题。

http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx

<%@ Page Language="C#" AutoEventWireup="true" ... %>
<%@ OutputCache ... %>

答案 2 :(得分:0)

以下是如何将Viewstate存储在本地临时文件中的示例: http://www.marklio.com/marklio/PermaLink.aspx?guid=af76f1a0-2d44-44c3-bfb5-029740b8e683

您仍在使用Viewstate这种方法,但不是填写HTML,而是在服务器端创建临时文件。因此,用户不会注意到Viewstate是巨大的。您还可以重写上面的示例以将Viewstate数据存储在其他位置,例如数据库甚至内存。

这种方法的优点是您不必重写很多代码。缺点是那些临时文件将填满服务器上的空间,需要偶尔清理一次。

答案 3 :(得分:0)

Rob,我要尝试的是在会话中缓存从数据库中检索的数据 - 第一次网格请求它。

如果您尝试将其与禁用网格视图状态相结合,则可以提供非常灵活的解决方案。

如果您不能指望Session进行缓存,那么总会有一些替代的持久性机制可以完成这项工作。

但是从给定情况的设计方面来看,我肯定会采用数据缓存方法。