8

即使在页面上,EnableViewState 属性被禁用,我仍然看到页面上存在一些视图状态:

"<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="VkBAB3n5LZYtY+nTzk1vEu1P/6QLf4qzFIKzpFRJe3DMf8UseUA/1RsO409HJX4QhkROSP0umoJvatjK/q+jXA==" />"

我的问题是为什么?

4

6 回答 6

8

是控制状态。

如果您真的想摆脱 viewstate 和 controlstate,您可以在页面的代码隐藏中或在代码隐藏派生自的任何类中使用此代码

class MyPage : Page {
    private class DummyPageStatePersister : PageStatePersister {
        public DummyPageStatePersister(Page p) : base(p) {}
        public override void Load() {}
        public override void Save() {}
    }
    private DummyPageStatePersister _PageStatePersister;
    protected override PageStatePersister PageStatePersister {
        get {
            if (_PageStatePersister == null)
                _PageStatePersister = new DummyPageStatePersister(this);
            return _PageStatePersister;
        }
    }

    // other stuff comes here
}

但是,这样做时要非常小心,因为您违反了与控件的合同。MSDN 明确声明控制状态始终可用。然而,在实践中,它对我有用。

编辑: 由于我被否决了,我想再次指出:除非您确切知道自己在做什么,否则不要这样做。在我的例子中,几乎整个应用程序都是用客户端 javascript 编写的,并且在少数发生回发的情况下,我总是使用 Request.Form 集合来检索值。如果您这样做,请不要将服务器端控件用于简单渲染之外的任何内容。

于 2009-01-05T16:12:32.707 回答
4

这可能是使用 ControlState 的控件。任何具有控件状态的控件都将忽略您的 ViewState 设置。

于 2009-01-05T15:59:41.393 回答
3

这篇文章有点旧,但据我了解,大部分观点仍然有效:

  1. 如果您想使用 ViewState,您的 ASPX 页面中必须有一个服务器端表单标记 ()。需要一个表单字段,以便包含 ViewState 信息的隐藏字段可以回发到服务器。而且,它必须是服务器端的表单,以便 ASP.NET 页面框架可以在服务器上执行页面时添加隐藏字段。
  2. 页面本身将 20 字节左右的信息保存到 ViewState 中,用于在回发时将 PostBack 数据和 ViewState 值分发到正确的控件。因此,即使为页面或应用程序禁用了 ViewState,您也可能会在 ViewState 中看到一些剩余字节。
  3. 如果页面没有回发,您可以通过省略服务器端标记从页面中消除 ViewState。

http://msdn.microsoft.com/en-us/library/ms972427.aspx

于 2009-01-05T16:06:54.560 回答
2

如果您使用 ASP.NET 进行开发,这绝对是一篇关于ViewState的精彩文章,请阅读它!

ASP.NET ViewState Helper也是查看 ViewState 中正在发生的事情的好工具

于 2009-01-05T19:32:14.053 回答
0

控制状态可能是原因。控制状态不能被禁用。在 ASP.NET 2.0 中,控制工作所需的数据 (controlstate) 和其他数据 (viewstate) 之间存在区别

是的,如果没有 controlstate,某些控件将无法工作。如果您想知道是哪一个导致它或视图状态包含什么,请查看视图状态查看器

于 2009-01-05T19:22:00.923 回答
0

实现IPostBackEventHandler的控件,如Textbox、Checkbox 等。即使在禁用视图状态后仍将保留状态。原因是在 Load Postback Data 阶段,这些控件将从 Posted back 表单中获取状态信息。

但是像label这样没有实现IPostBackEventHandler的控件将不会从回发的数据中获取任何状态信息,因此完全依赖于 viewstate 来维护状态。

于 2013-04-30T07:23:48.183 回答