【问题标题】:How can a custom ASP.NET control cache data without using the ViewState?自定义 ASP.NET 控件如何在不使用 ViewState 的情况下缓存数据?
【发布时间】:2009-02-24 20:29:35
【问题描述】:

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

那么这甚至可能吗?如果是这样,有人可以向我指出有关如何执行此操作的更多信息的方向吗?如果不可能,有人对我如何解决这个问题有任何建议吗?

【问题讨论】:

    标签: asp.net optimization viewstate web-controls


    【解决方案1】:

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

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

    【讨论】:

    • 小心 SavePageStateToPersistenceMedium 和 LoadPageStateFromPersistenceMedium 重载。它们在使用 asp.net ajax 控件时中断。这让我们在一个大型项目上大受打击。
    • @Andrew - 我们在这个应用程序中使用了很多 ASP.NET Ajax,如果出现这种中断将是“坏事™”
    【解决方案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 ... %>
    

    【讨论】:

    • 我正在处理的自定义 GridView 将用于只读视图,因此不必担心无法访问编辑。然而,我们试图允许的一件事是快速对数据集应用排序,现在在服务器端的 DataTable 中缓存所有内容似乎......
    • ...更好的做事方式。但是,鉴于我们的情况,我仍然不确定这是否是最好的方法。
    【解决方案3】:

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

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

    这种方法的优点是您不必重写太多代码。缺点是那些临时文件会占满服务器空间,需要时不时清理一下。

    【讨论】:

      【解决方案4】:

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

      如果您尝试此方法并将其与禁用网格的视图状态相结合,您可以提出非常巧妙的解决方案。

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 2014-07-16
        • 2010-11-13
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        相关资源
        最近更新 更多