ASP.net ViewState - 即使在禁用时,也存在一些视图状态。为什么?

时间:2009-01-05 15:57:46

标签: asp.net viewstate

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

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

我的问题是为什么?

6 个答案:

答案 0 :(得分: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集合来检索值。 如果执行此操作,请不要使用服务器端控件进行简单渲染。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

这篇文章有点陈旧,但根据我的理解,大多数要点仍然有效:

  1. 如果要使用ViewState,则必须在ASPX页面中具有服务器端表单标记()。需要表单字段,因此包含ViewState信息的隐藏字段可以回发到服务器。并且,它必须是服务器端表单,因此ASP.NET页面框架可以在服务器上执行页面时添加隐藏字段。
  2. 页面本身将大约20个字节的信息保存到ViewState中,它用于在回发时将PostBack数据和ViewState值分配给正确的控件。因此,即使为页面或应用程序禁用了ViewState,您也可能会在ViewState中看到一些剩余的字节。
  3. 如果页面没有回发,您可以通过省略服务器端标记来消除页面中的ViewState。
  4. http://msdn.microsoft.com/en-us/library/ms972427.aspx

答案 3 :(得分:2)

如果您在ASP.NET中开发,请阅读ViewState,这是一篇绝对精彩的文章!

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

答案 4 :(得分:0)

Controlstate可能是原因。无法禁用控制状态。在ASP.NET 2.0中,进行控制工作所需的数据(控制状态)与其他数据(视图状态)之间存在区别

是的,有些控件在没有controlstate的情况下不起作用。 如果您想知道哪一个导致它或者查看状态包含什么,请查看viewstate viewer

答案 5 :(得分:0)

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

label 之类的控件如果没有实现 IPostBackEventHandler ,则不会从发回的数据中获取任何状态信息,因此完全依赖于viewstate来维持状态。