【问题标题】:Viewstate history gets affected by activity on a different pageViewstate 历史受到不同页面上的活动的影响
【发布时间】:2013-10-22 16:48:29
【问题描述】:

我目前有一个问题,如果我们打开另一个页面并在那里进行一些回发,那么在一个页面上,Viewstate 信息会消失,即:

  1. 打开 ListPage,更改表单选择的选项并进行回发
  2. 按下在新选项卡上打开 AddPage 的按钮
  3. 在 AddPage 上,添加几个执行多个回发的新条目,关闭选项卡
  4. 返回 ListPage 尝试刷新网格
  5. 在 ListPage 上,视图状态为空

因此,如果我有一个属性正在存储并从 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 配置如何影响它。

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/questions/5577591/…
  • 不完全是,我已经在使用会话变量来绕过它,但视图状态仍然会丢失。每个页面的视图状态都是特定的,但 Session 只存储有限数量的视图状态,因此不同页面上的活动最终会清除旧的视图状态。我也期望这种行为是特定于页面的。

标签: c# asp.net telerik viewstate


【解决方案1】:

发现发生了什么,

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多