10

我想在会话中保留特定页面的视图状态,但是下面的代码块对我没有帮助,我可能会丢失什么?

所以这是我页面的代码隐藏文件内容;

    public partial class ConfigurationEditorWebForm : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected override bool VerifyAccess()
        {
            return true;
        }

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

4 回答 4

9

请注意,即使将页面状态移动到视图状态后,您仍然会在页面上看到 __Viewstate 元素。

另外,我相信这个解决方案可能比其他提供的解决方案更正确,因为它更优雅地处理后退按钮。当您将 ViewState 存储在隐藏变量中时,它成为 HTML 的一部分,因此如果用户单击后退按钮 2 或 3 页并继续他正在做的事情,它就可用。在每个页面请求中盲目地丢弃 Viewstate 将阻止后退按钮按用户期望的方式运行。

但是,首先要注意这可能不是一个好主意。我建议至少先做两件事:

首先,确保您已关闭所有不需要它的控件上的 Viewstate(可能是大多数控件)。您可以通过将“IsViewstateEnabled”设置为 false 来执行此操作。

其次,在您的网络服务器上打开 http 压缩。即使您有一个合理大小的视图状态,总页面重量(压缩时 -不是在您的浏览器中查看的)应该相对较小。

希望有帮助!

于 2009-01-28T02:34:23.507 回答
4

您可能会在 ViewState 隐藏字段中看到 ControlState,它的存储方式与“正常”ViewState 不同。

要将 ControlState 也存储在会话中,请将以下条目添加到 web.config 文件:

  <system.web>
    <browserCaps>
      <case>
        RequiresControlStateInSession=true
      </case>
    </browserCaps>
  </system.web>

查看此页面了解更多信息。

于 2009-02-03T17:29:43.627 回答
3

代码的重要部分是

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

这会覆盖普通的页面状态持久化器,并提供一个将页面数据持久化到 Session 而不是 ViewState 的持久化器。

于 2009-01-27T18:39:43.637 回答
3

我的答案可能不是你想要的,但作为最后的手段,你可能不得不做这样的事情。

我应用了https://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=240686中描述的反射锁,并构建了自己的进程内会话管理器并将所有会话数据存储在其中。

在发现 WYSIWYG 构建器生成的 HTML 不佳后,我转而使用 Response.Write 手动编写所有 HTML。

Presto 没有更多的问题。很多工作,但这是值得的。

编辑:低于 0 的投票不公平,因为您不喜欢忽略所有 Web 表单的想法。当工具对我不起作用时,我不会使用它们。如果工具不适合你并且你不能让它们工作,你也不应该使用它们。

于 2009-01-28T02:58:11.680 回答