【问题标题】:At what point is the ViewState mapped to the Page session?ViewState 在什么时候映射到 Page 会话?
【发布时间】:2012-04-13 02:54:18
【问题描述】:

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

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

我假设这发生在 control.SaveViewState() 方法中。

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

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

【问题讨论】:

标签: asp.net viewstate


【解决方案1】:

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

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


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

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

【讨论】:

  • +1。此外,请参阅页面生命周期文档以获取更详细的说明。无论如何,每个 ASP.NET WebForms 开发人员都需要知道这一点。 msdn.microsoft.com/en-us/library/ms178472.aspx
  • 好的,如果页面会话超时,viewstate 变量会保留吗?在很多情况下我都认为是的。
  • @KevinDeus 一般来说,是的。可以实现一种自定义方法来保存/恢复视图状态(例如,持久保存在服务器上)但是...... ick,这不是默认的。
  • @pst,好的,很酷。不希望重构 ViewState,只是试图跟踪变量为何存在。我担心如果你清除会话,由于 ViewState 存储在页面上,它会在清除后重新映射到新的会话变量。
  • 另外,不要将 ViewState 与 IPostBackDataHandler 混淆。 msdn.microsoft.com/en-us/library/…
【解决方案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 进行比较?

【讨论】:

  • 因为我看到有时 ViewState 变量在会话超时后仍然存在。我还没有缩小为什么会发生这种情况
  • 我希望这句话已经被清除'ViewState will Persist across Postback and Session不会影响ViewState,尽管它已经超时'。如果会话超时,它会将用户重定向到某个逻辑页面。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多