即使在页面上,EnableViewState 属性被禁用,我仍然看到页面上存在一些视图状态:
"<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="VkBAB3n5LZYtY+nTzk1vEu1P/6QLf4qzFIKzpFRJe3DMf8UseUA/1RsO409HJX4QhkROSP0umoJvatjK/q+jXA==" />"
我的问题是为什么?
是控制状态。
如果您真的想摆脱 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 集合来检索值。如果您这样做,请不要将服务器端控件用于简单渲染之外的任何内容。
这可能是使用 ControlState 的控件。任何具有控件状态的控件都将忽略您的 ViewState 设置。
这篇文章有点旧,但据我了解,大部分观点仍然有效:
如果您使用 ASP.NET 进行开发,这绝对是一篇关于ViewState的精彩文章,请阅读它!
ASP.NET ViewState Helper也是查看 ViewState 中正在发生的事情的好工具
控制状态可能是原因。控制状态不能被禁用。在 ASP.NET 2.0 中,控制工作所需的数据 (controlstate) 和其他数据 (viewstate) 之间存在区别
是的,如果没有 controlstate,某些控件将无法工作。如果您想知道是哪一个导致它或视图状态包含什么,请查看视图状态查看器
实现IPostBackEventHandler的控件,如Textbox、Checkbox 等。即使在禁用视图状态后仍将保留状态。原因是在 Load Postback Data 阶段,这些控件将从 Posted back 表单中获取状态信息。
但是像label这样没有实现IPostBackEventHandler的控件将不会从回发的数据中获取任何状态信息,因此完全依赖于 viewstate 来维护状态。