【问题标题】:Move ViewState server-side移动 ViewState 服务器端
【发布时间】:2010-12-16 21:49:22
【问题描述】:

好的,所以我有一个 ASP.NET 应用程序,我正在努力减少页面的开销(我们的用户拥有平均 10 年使用的 PC)。

其中一种方法是将 ViewState 移动到服务器端。我们有足够的内存。

我在这里遵循最常被引用的模式:http://authors.aspalliance.com/robertb/articles.aspx?articleId=2

因为是 7 年前写的,我不得不更新一些过时的函数,即 RegisterHiddenField 到 ScriptManager.RegisterHiddenField 和 ConfigurationSettings.AppSettings 到 ConfigurationManager.AppSettings。

这似乎工作得很好,但是一旦我执行 AJAX 回发,我就会收到错误

Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerServerErrorException: The state information is invalid for this page and might be corrupted.

我还注意到现在每个页面上都有两个隐藏的“__VIEWSTATE”字段,其中一个为空,其中一个具有我班级的数值。我认为这与问题有关——也许 AJAX 更新正在尝试从空的而不是具有值的读取?

有谁知道为什么会出现这个错误?

【问题讨论】:

  • 您想从 HTML 页面中删除一些简单的文本值,因为您的用户拥有如此古老的计算机……但您正在使用 AJAX 更新???
  • @Andrew:AJAX 纯粹是良好的性能。 (正确使用时)
  • @SLaks - 在相对现代的系统上,不会阻塞在 HTML 中额外的几千字节纯文本,当然。但是在具有十年历史的系统上,显然内存太少了,它们无法处理页面上几 K 额外的隐藏数据?在我看来,这里更好的优化技术是将 ViewState limit 限制在真正需要的范围内,并停止要求浏览器做更多的“提升”,当它被认为是一个年长的弱者时默认。
  • @Andrew:选择要么刷新整个页面,要么使用 AJAX 仅刷新其中的一小部分。我选择只刷新一小部分。所以是的,AJAX 是一种性能提升。
  • @msigman - 你最终会失去很多开发人员的性能,因为你真正应该在这里做的是限制视图状态......而不是消除它......或者只是使用一个框架'首先不要从 ViewState 开始,比如 ASP.NET MVC(如果你已经有一个工作的应用程序,可能不是一个选项)

标签: asp.net


【解决方案1】:

答案是根本不使用提供的示例。它已经过时了,现在框架本身提供了更好的解决方案。

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

我刚刚将这 4 行添加到我的 BasePage 类中,瞧 - 页面大小立即减少了约 30%,它适用于 AJAX 更新。

【讨论】:

  • 我知道你会找到一种不涉及消除 ViewState 的方法 :)
  • 这大大减少了我的页面大小。而且页面加载速度更快/响应速度更快
【解决方案2】:

发生这种情况是因为您没有向 MS AJAX 框架告知您新的服务器端 ViewState 机制;它正在获取新值,这些值是简单的修剪键,指向在 Session 对象中的何处找到它。 AJAX 框架对此一无所知。

减少 ViewState 最容易通过在根本不需要的控件上禁用它来完成。如果您使用的是 ASP.NET 4.0,则可以做得更好 - 默认情况下在整个页面上禁用它,然后只在需要的地方启用它。

【讨论】:

  • 嗯,这是有道理的。但是,我最终放弃了整个方案,转而使用内置的 .NET SessionPageStatePersister 类。
  • 没有任何理由不能两者兼得。您应该始终尝试减少 ViewState,无论它存储在哪里,IMO。
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
相关资源
最近更新 更多