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

Posted

技术标签:

【中文标题】在 asp.net 中减少 ViewState 大小的策略【英文标题】:Strategies for reducing ViewState size in asp.net 【发布时间】:2010-12-28 23:45:20 【问题描述】:

我在我的页面中使用了“n”个服务器控件。现在我开始进行性能调整,我注意到我的ViewState 太大了,这让我的页面变慢了。

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

【问题讨论】:

为什么你认为ViewState是页面慢的原因?您是否使用过 HttpFox 之类的工具来更仔细地检查事物? 【参考方案1】:

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

您有“n”个服务器控件,您是否需要所有“n”个数字都是服务器控件而不仅仅是纯 html

假设您真的需要所有“n”个,是否所有这些都需要启用视图状态?

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

【讨论】:

【参考方案2】:

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

假设您当前仅在需要的地方使用视图状态,您可以执行以下操作:

    Labels 切换为Literals,尤其是在模板中使用它们时。标签需要更多的视图状态。 尽量减少回发。更少的回发将使您需要更少地使用视图状态,因为您不需要重新加载整个页面。例如,使用 AJAX 调用并通过客户端操作写出数据。 使用会话或缓存为网格和数据密集型控件存储大量数据。每次重新加载时,只需自己填写即可。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

正是我遇到的问题。我不得不扩展 HiddenFieldPageStatePersister 并将视图状态保存在数据库中。我已经写了整篇文章来指导你。

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

【讨论】:

以上是关于在 asp.net 中减少 ViewState 大小的策略的主要内容,如果未能解决你的问题,请参考以下文章

10asp.net==============VIEWSTATE和Cookis

Telerik ASP.NET Ajax RadGrid 在 MVC 和 ViewState 中?

ASP.NET ViewState详解

asp.net c# MVC:没有 ViewState 我该如何生活?

ASP.NET,用户控件和 ViewState 丢失了正确的数据,尝试进入用户控件事件

ASP.net EventValidation 和 ViewState 是不是可以缓解暴力攻击?