在代码隐藏中获取原始 ViewState 数据

Get raw ViewState data in code behind

我想在代码隐藏中获取原始 ViewState 数据。 像这样:

private string GetRawViewState()
{
 // What code should be here.
}
// sample result : +9O4aKH/cgkvaOlTP4rWZotoC6yCtEXUhV2khD3IdEcQXc3wwdhiK2oOgWBVYsFmmZc60tR+Vu+XJRi9/9mpzrHbwDuvnq684rT+W8XywFHw2r3KdgVDVPqwHVL3TChORfmaBkcKAYlXf0Fl54PZ/FWfWB96s9fIf4/2iu57Wb0=

我认为没有简单的方法可以做到这一点。

根据internal String Page.ClientState { get; set; }中的序列化内容渲染__VIEWSTATE字段的是internal void Page.RenderViewStateFields(HtmlTextWriter)。序列化由受保护的 HiddenFieldPageStatePersister.Save(), but you can only access it via Page.PageStatePersister 完成。

因此,没有简单的 api 调用可供您执行此操作。

自定义页面 class(在 web.config 中使用 <tagMapping>)将能够访问具有受保护可见性的内容,这意味着您可以访问 PageStatePersister 实例,但您可以无权访问序列化值。您可以创建自己的 ObjectStateFormatter 并序列化 PageStatePersister.ViewState 和 PageStatePersister.ControlState 属性,但我不确定生成的值是否与发送给客户端的值相同。

反之,反射只能读取Page.ClientState 属性。这在 Page.SaveStateComplete event, which occurs after PageStatePersister.Save() 已被内部调用时可供您使用。这可能是最简单的方法。