在asp.net中减少ViewState大小的策略

时间:2009-12-22 04:46:20

标签: asp.net performance controls scalability viewstate

我在页面中使用了'n'个服务器控件。现在我进入了性能调优,我注意到我的ViewState太大了,这让我的页面变慢了。

我知道Gzip可以压缩ViewState大小。在asp.net中减少ViewState的任何其他建议。我不想在IIS中执行,因为我的Web应用程序托管在共享服务器上。

6 个答案:

答案 0 :(得分:8)

假设视图状态的大小是“缓慢”的主要原因,我建议您从更全面的方法解决它。

你有'n'个服务器控件,你需要所有'n'数字作为服务器控件而不仅仅是纯HTML吗?

说你真的需要他们所有'n',他们都需要启用viewstate吗?

这是一篇很好的文章(如果您还没有阅读过),它提供了更多见解: VIEWSTATE size minimization

答案 1 :(得分:5)

EnableViewState = false;应该成为你的朋友。

假设您目前仅在需要的地方使用viewstate,则可以执行以下操作:

  1. Labels切换为Literals,尤其是在模板中使用它们时。标签需要更多的观点。
  2. 尝试减少回发。较少的回发将使您需要使用较少的viewstate,因为您不需要重新加载整个页面。例如,使用AJAX调用并通过客户端操作写出数据。
  3. 使用会话或缓存来存储网格和数据繁重控件的大量数据。每次重新加载,只需自己填写。

答案 2 :(得分:2)

只有在需要记住回发之间的页面状态时才应使用视图状态。它用于防止对数据库的额外访问。因此,如果您的控件不需要,请使用EnableViewState = False。如果您网页上的任何内容都不需要视图状态,则可以通过在EnableViewState = False代码中添加Page来停用该网页的视图状态。

如果您的服务器负担得起,您可能希望将数据传输到Sessions。如果安全需要(viewstate不应包含敏感数据),或者viewstate持有大量数据,请执行此操作。请注意,默认情况下,Sessions存储在服务器的内存中。因此,如果您期望许多并发用户,则不希望对大数据使用太多。但是,您可以更改会话存储的位置(即另一台服务器)。

答案 3 :(得分:2)

将以下代码添加到生成大型viewstate值的页面。 或者,可以将其添加到母版页,以消除在每个页面上添加的需要。以下代码允许将视图状态存储在会话中。

        protected override PageStatePersister PageStatePersister
    {
        get
        {
            return new SessionPageStatePersister(this);
        }
    }

答案 4 :(得分:0)

您应该做的第一件事就是在不需要它的地方关闭viewstate。检查控件并确定哪些控件绝对需要打开viewstate。

答案 5 :(得分:0)

正是我遇到的问题。我不得不扩展HiddenFieldPageStatePersister并将viewstate保存在数据库中。我写了一篇完整的文章来指导你。

http://ashishnangla.com/2011/07/21/reducing-size-of-viewstate-in-asp-net-webforms-by-writing-a-custom-viewstate-provider-pagestatepersister-part-12/