【问题标题】:Keeping ViewState in SessionPageStatePersister在 SessionPageStatePersister 中保持 ViewState
【发布时间】:2008-12-22 12:20:04
【问题描述】:

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

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

    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);
            }
        }
    }

【问题讨论】:

    标签: asp.net session viewstate


    【解决方案1】:

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

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

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

    首先,确保您已关闭所有不需要 Viewstate 的控件(可能是大多数控件)。您可以通过将“IsViewstateEnabled”设置为 false 来做到这一点。

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

    希望有帮助!

    【讨论】:

      【解决方案2】:

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

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

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

      查看this page了解更多信息。

      【讨论】:

      • M4N:感谢您的回复,ControlState 正在占用 __VIEWSTATE 字段的其余部分!
      【解决方案3】:

      代码的重要部分是

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

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

      【讨论】:

      • 我真的希望这个人不要仅仅因为突出问题而获得赏金。
      • 问题是他所做的一切都是正确的,除非他发布更多,否则他可能只是以错误的方式使用 ViewState。我想确保搜索用户不会偶然发现并认为他的做法是错误的。
      • 您好,很抱歉对问题不感兴趣。首先,我所做的完全一样,正如您从代码中看到的那样。我必须做点别的事来……
      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 如果您使用 Html 控件(来自 System.Web.UI.HtmlControls)并将 EnableViewState 设置为 false,您可能会发现更易于维护。如果其他人需要在您的网站上工作,这也将与其他程序员的工作方式更加一致。
      • 仍然会生成
        等标签,这在 HTML 4.01 中是不正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多