如何获取已构建的已编码ViewState的值?

时间:2020-03-05 18:37:28  来源:igfitidea点击:

我需要获取ViewState的base64编码表示形式。显然,直到请求生命周期中的相当晚才可以使用,这是可以的。

例如,如果页面的输出包括:

<input type="hidden" name="__VIEWSTATE" 
  id="__VIEWSTATE" value="/wEPDwUJODU0Njc5MD...==" />

我需要一种在服务器端获取值" / wEPDwUJODU0Njc5MD ... =="的方法。

为了澄清,我需要在呈现页面时使用此值,而不是在PostBack上。例如我需要知道发送给客户端的ViewState值,而不是我从他们那里得到的ViewState。

解决方案:

雷克斯,我怀疑一个开始寻找## 解决方案的方法是压缩ViewState-在将ViewState发送到客户端之前将其抢占到服务器上并压缩它。那正是我们想要的位置。

  • Scott Hanselman谈ViewState压缩(2005)
  • System.IO.Compression的ViewState压缩(2007)

请参阅此博客文章,作者在其中描述了一种方法,该方法可替代用于生成ViewState的默认行为,而是显示如何将其保存在服务器Session对象上。

In ASP.NET 2.0, ViewState is saved by
  a descendant of PageStatePersister
  class. This class is an abstract class
  for saving and loading ViewsState and
  there are two implemented descendants
  of this class in .Net Framework, named
  HiddenFieldPageStatePersister and
  SessionPageStatePersister. By default
  HiddenFieldPageStatePersister is used
  to save/load ViewState information,
  but we can easily get the
  SessionPageStatePersister to work and
  save ViewState in Session object.

尽管我没有测试他的代码,但它似乎确实显示了我们想要的内容:一种在回发之前仍在服务器上的同时访问ViewState代码的方法。

我在与上面发布的文章类似的文章之后启用了压缩功能。在应用程序发送ViewState之前,访问ViewState的关键是重写此方法。

protected override void SavePageStateToPersistenceMedium(object viewState)

我们可以在此覆盖范围内调用base方法,然后添加处理ViewState所需的任何其他逻辑。