在SessionPageStatePersister中保持ViewState

时间:2008-12-22 12:20:05

标签: asp.net session viewstate

我希望在会话中保持特定页面的视图状态,但是在代码块后面对我没有帮助,我可能会遗漏哪些内容?

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

    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 个答案:

答案 0 :(得分:9)

请注意,即使将页面状态移至查看状态,您仍会在页面上看到__Viewstate元素。

此外,我相信this solution可能比其他人提供的更正确,因为它更优雅地处理后退按钮。当您将ViewState存储在隐藏变量中时,它将成为HTML的一部分,因此,如果用户单击后退按钮2或3页并继续他正在执行的操作,则可以使用它。使用每个页面请求盲目地删除Viewstate将阻止后退按钮按照用户期望的方式运行。

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

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

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

希望有所帮助!

答案 1 :(得分:4)

您可能在ViewState隐藏字段中看到的是ControlState,其存储方式与“普通”ViewState不同。

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

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

查看this page了解更多信息。

答案 2 :(得分:3)

代码的重要部分是

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

这会覆盖正常的页面状态持久性,并提供一个将页面数据持久保存到Session而不是ViewState的文件。

答案 3 :(得分:2)

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

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

在发现WYSIWYG构建器生成不良HTML后,我切换到使用Response.Write手动编写所有HTML。

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

编辑:没有公平的低估0,因为你不喜欢忽视所有网络表单的想法。当工具对我不起作用时,我不使用它们。如果工具不适合您并且无法使它们正常工作,则不应使用它们。