ViewState占用了20%的页面,即使它被禁用了!

时间:2009-05-22 08:55:44

标签: asp.net viewstate

我在web.config文件中禁用了viewstate(并且页面上的任何地方都没有EnableViewState = true),但是尽管如此,页面仍然以非常大的视图状态呈现(对于40k页面,为8k)。我用viewstate解码器检查了viewstate内容,发现我在我的页面上使用的多视图控件是有罪的。反正有没有使用viewstate停止多视图控件?

我正在考虑创建一个继承自MultiView并覆盖LoadViewState和SaveViewState方法的控件类,但我将此作为最后的手段,任何建议?

由于

5 个答案:

答案 0 :(得分:4)

这是一个很好的方式来摆脱每个回发后通过电汇发送的viewstate。基本上,它将完整的视图状态存储为服务器上的会话变量,并仅在视图状态字段中传输标识符。

压缩会在带宽方面节省一点点,而将视图状态从页面中移出会带来非常显着的性能提升

以下文章介绍了几种具有效果衡量指标的技术eggheadcafe

答案 1 :(得分:3)

自ASP.NET 2.0以来,ViewState隐藏字段的内部内容由“旧”ViewState(ViewState状态包/字典)和 ControlState 组成。与ViewState不同的控制状态不能被禁用,它用于控件需要正常运行的最小信息。

您无法禁用ControlState,并且要么使用它,要么在页面上使用不同的(种类)控件。

答案 2 :(得分:2)

您可以覆盖页面(或基页)扫描以获取视图状态隐藏输入,并将其从编写器中删除。

步骤进行:

  • 做base.render
  • 将htmlwriter内容输出到字符串
  • 使用__viewstate删除输入
  • 将新字符串写入HTMLWriter。

答案 3 :(得分:1)

为了回答我自己的问题,我设法通过删除我在母版页中使用的表单runat =“server”来摆脱视图状态,现在我只使用runat =封装了真正需要在表单标记中回发的控件服务器。它似乎也放弃了控制状态(这是我想要的,页面不会回发),但仍然需要调查更多。

剩下的唯一问题是,当我在页面的任何位置添加表单runat = server标签时,Multiview会找到我的表单标签并将其垃圾桶添加到隐藏的viewstate字段中,我认为这只会在多视图中发生以runat =“server”标签的形式包含,但它足够聪明(或者在这方面足够愚蠢),无论如何都能找到表单标签。

答案 4 :(得分:0)

System.Web.UI.Page类有一个名为PageStatePersister的属性,您可以在页面中覆盖该属性。在这里,您可以返回一个PageStatePersister类型对象,该对象将覆盖页面viewstate的默认持久性模式。

正如Vikram建议您可以使用SessionPageStatePersister在会话中存储视图状态而不是隐藏字段。但是,您也可以实现自己的PageStatePersister,将viewstate存储在Cache或数据库或文件中。无论你真正需要什么。

您不应该使用PageStatePersister来丢弃viewstate,因为某些控件需要viewstate。