3

我试图了解这里的事件顺序。

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

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

谁能告诉我什么时候发生这种情况?

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

4

2 回答 2

3

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

然而ViewState != Session。ViewState 与页面表单相关联,而不是与会话相关联,因为它位于隐藏__VIEWSTATE字段2中。因此,除非在检测到会话超时时以其他方式“清除”它,否则它仍会在下一次回发时发布客户端存储的值(可能是数小时或数天,旧的;-)。


1在PreLoad中访问ViewState其实是可以的,Page可以使用,但一般的Controls不可以。LoadViewState/TrackViewState默认在页面初始化之后完成。(并且页面的初始化是在当前层次结构中的所有控件的初始化之后完成的。)

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

于 2012-04-12T18:14:17.073 回答
2

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

现在开始调试每个事件的按钮单击。

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 进行比较?

于 2012-04-12T18:24:09.453 回答