在 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 c# MVC:没有 ViewState 我该如何生活?