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

StackOverflow https://stackoverflow.com/questions/413558

  •  03-07-2019
  •  | 
  •  

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

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

我的问题是为什么?

有帮助吗?

解决方案

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

其他提示

这是控制状态。

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

这是一篇关于的精彩文章ViewState 如果你在ASP.NET中开发阅读它!

ASP.NET ViewState Helper 也是一个很好的工具,用于查看正在发生的事情在你的ViewState中

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top