Asp.net 在SessionPageStatePersister中保留ViewState

Asp.net 在SessionPageStatePersister中保留ViewState,asp.net,session,viewstate,Asp.net,Session,Viewstate,我想在会话中保持特定页面的viewstate,但下面的代码块对我没有帮助,我可能缺少什么 下面是我页面文件内容背后的代码 public partial class ConfigurationEditorWebForm : PageBase { protected void Page_Load(object sender, EventArgs e) { } protected override bool Verify

我想在会话中保持特定页面的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);
            }
        }
    }

代码的重要部分是

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

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

请注意,即使将页面状态移动到view state,您仍然会在页面上看到一个u ViewState元素

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

然而,如果不注意到这一点,那可能不是一个好主意。我建议至少先做两件事:

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

其次,在Web服务器上启用http压缩。即使您有一个大小合理的viewstate,页面的总重量(压缩时-不是在浏览器中查看时)也应该相对较小


希望有帮助

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

我应用了中描述的反射锁,构建了自己的进程内会话管理器,并将所有会话数据存储在其中

在发现WYSIWYG生成器生成的HTML很差之后,我转而使用Response.Write手动编写所有HTML

别再有问题了。做了很多工作,但还是值得的


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

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

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

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

RequiresControlStateInSession=true

查看更多信息。

如果使用Html控件(来自System.Web.UI.HtmlControls)并将其上的EnableViewState设置为false,您可能会发现维护起来更容易。如果其他人需要在你的网站上工作,这也将与其他程序员的工作方式更加一致。仍然会生成
之类的标记,这在HTML 4.01中是不正确的。我真的希望这家伙不会因为强调问题而得到赏金。问题是他所做的一切都是正确的,除非他发布更多,他可能只是以错误的方式使用了ViewState。我想确保一个搜索用户没有被绊倒,并认为他所做的是错误的。嗨,再次,很抱歉对这个问题不感兴趣。首先,正如您从代码中看到的,我所做的完全相同。M4N:谢谢你的回复,ControlState占用了VIEWSTATE字段的其余部分!