ViewState在什么时候映射到Page会话?

时间:2012-04-12 18:11:59

标签: asp.net viewstate

我试图了解事件的顺序。

This页面告诉我,在页面生命周期的某个时刻,ViewState被映射到页面会话。

我假设在控件。SaveViewState()方法中发生了这种情况。

有人能告诉我这发生的时间吗?

我很担心,因为我看到一些代码在Page_Load中读取ViewState变量,我认为即使在会话清除后它仍然会返回信息。 (导致我们设置的超时重定向问题)

2 个答案:

答案 0 :(得分:3)

ViewState在 Init和Load 1 之间恢复,并在 PreRender之后保存。因此,在通过PreRender加载时使用它是有效的。

然而ViewState != Session。 ViewState与页面表单绑定,而不是会话,因为它位于隐藏的__VIEWSTATE字段 2 中。因此,除非在检测到会话超时时“清除”,否则它仍然会在下一个帖子上发布客户端存储的值(可能是几小时,几天,几天;-)回来。


1 实际上可以在PreLoad中访问ViewState,它可用于页面而不是常规控件。 LoadViewState / TrackViewState默认情况下在页面Init之后完成。 (并且在当前在层次结构中的所有控件的初始化之后完成页面的初始化。)

2 我认为使用表单是处理ViewState的唯一正确方式。但是,它可以使用不同的支持(例如服务器端)进行存储/加载。

答案 1 :(得分:2)

首先,在页面加载中初始化ViewState。在每个页面上设置BreakPoints事件,如下所述。

现在,在每个事件的按钮上启动调试。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        ViewState["abc"] = "10";
    }
}

protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);
}

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
}

protected override void OnInitComplete(EventArgs e)
{
    base.OnInitComplete(e);
}

protected override void OnPreLoad(EventArgs e)
{
    base.OnPreLoad(e);
}

OnPreLoad将开始为您提供ViewState持久值。在此事件之前,如Init / InitComplete / PreInit将不会给出任何ViewState值。

发生回发时,SaveViewState()将捕获新值,LoadViewState()将在回发后重新填充。

为什么要将Session与ViewState进行比较?