关于c#:如何获取已构建的已编码ViewState的值?

关于c#:如何获取已构建的已编码ViewState的值?

How to get the value of built, encoded ViewState?

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

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

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

我需要在服务器端获取值"/wEPDwUJODU0Njc5MD...=="

的方法

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


Rex,我怀疑一个开始寻找压缩压缩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的关键是重写此方法;

1
protected override void SavePageStateToPersistenceMedium(object viewState)

您可以在此重写中调用基本方法,然后添加处理ViewState所需的任何其他逻辑。


推荐阅读