ASP.net ViewState - 即使在禁用时,也存在一些视图状态。为什么?
题
即使在页面上,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集合来检索值。 如果执行此操作,请不要使用服务器端控件进行简单渲染。
这篇文章有点陈旧,但根据我的理解,大多数要点仍然有效:
- 如果要使用ViewState,则必须在ASPX页面中具有服务器端表单标记()。需要表单字段,因此包含ViewState信息的隐藏字段可以回发到服务器。并且,它必须是服务器端表单,因此ASP.NET页面框架可以在服务器上执行页面时添加隐藏字段。
- 页面本身将大约20个字节的信息保存到ViewState中,它用于在回发时将PostBack数据和ViewState值分配给正确的控件。因此,即使为页面或应用程序禁用了ViewState,您也可能会在ViewState中看到一些剩余的字节。
- 如果页面没有回发,您可以通过省略服务器端标记来消除页面中的ViewState。 醇>
这是一篇关于的精彩文章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来维持状态。