Viewstate历史记录受到其他页面上的活动的影响

时间:2013-10-21 10:52:17

标签: c# asp.net telerik viewstate

我有一个当前的问题,在一个页面上,如果我们打开一个不同的页面并在那里做一些回发,Viewstate信息就会消失,即:

  1. 打开ListPage,更改选定的选项并进行回发
  2. 按下在新标签页上打开AddPage的按钮
  3. 在AddPage上添加几个新条目,执行多个回发,关闭标签
  4. 返回ListPage尝试刷新网格
  5. 在ListPage上,viewstate为空
  6. 因此,如果我有一个属性存储并从viewstate获取它的值,则在步骤5中从viewstate获取null。

    if (ViewState["Stuff"] == null)
        return MyObject.Default;
    else
        return (MyObject)ViewState["Stuff"];
    

    根据我的理解,viewstate历史记录大小默认为9(<sessionPageState historySize="9" />),但我不希望在不同页面之间共享它并且不想更改此值。

    我可以通过将每个页面生成的Guid存储在会话中来存储存储的属性,但是表单控件以及从数据库中获取值的任何内容都需要重新设置。

    有没有办法让标签/窗口之间的视图状态历史独立?或者任何想法如何绕过它?

    如果有帮助,我会在每个页面上使用Telerik控件。

    修改:this explanation帮助我了解视图状态信息在会话中的确切存储方式以及sessionPageState配置如何影响它。

1 个答案:

答案 0 :(得分:2)

了解发生了什么,

默认情况下,Pages会在会话中存储ViewState,即使用System.Web.UI.SessionPageStatePersister。知道这一点,然后观察到的行为是正常的。它只存储一定数量的页面状态(回发),并且对于每个回发,旧的信息都会丢失,无论在哪个选项卡/页面中进行回发,只要它在同一个会话中。

我将此添加到我的页面中,告诉它将ViewState存储在页面本身的隐藏字段中。那已经是我以为它正在发生的事情。

protected override PageStatePersister PageStatePersister
{
    get
    {
        return new HiddenFieldPageStatePersister(this);
    }
}