表示Viewstate Visible的短字符串,即使禁用了每个控件上的视图状态

时间:2011-06-28 05:25:05

标签: asp.net

我禁用了页面上的viewstate及其中的每个控件。但我仍然看到短字符串代表页面源中的视图状态。

我创建了一个包含两个控件的页面,一个是复选框,另一个是texbox。我完全禁用了控件和页面的视图状态。但我仍然看到一个div渲染,其中包含隐藏变量中的viewstate:

<div class="aspNetHidden"> <input id="__VIEWSTATE" type="hidden" 
    value="/wEPDwUKMTcwNTQzMjY4MWQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFG‌​
    2N0bDAwJE1haW5Db250ZW50JGNoYm94VGVzdPRq7jJUwzyCcKYfAFB/seRcAvziSp3bKL23H9U7O9sU" 
    name="__VIEWSTATE"> </div>

任何人都可以帮助理解asp.net的这种行为

2 个答案:

答案 0 :(得分:1)

1)如果要使用ViewState,则必须在ASPX页面中具有服务器端表单标记()。需要表单字段,因此包含ViewState信息的隐藏字段可以回发到服务器。并且,它必须是服务器端表单,因此ASP.NET页面框架可以在服务器上执行页面时添加隐藏字段。

2)页面本身将大约20个字节的信息保存到ViewState中,它用于在回发时将PostBack数据和ViewState值分配给正确的控件。因此,即使为页面或应用程序禁用了ViewState,您也可能会在ViewState中看到一些剩余字节。

3)如果页面没有回发,您可以通过省略服务器端标记来消除页面中的ViewState。

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

这是控制状态。

如果你真的想摆脱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 :(得分:0)

不,你无法完全摆脱View State。即使您关闭每个控件上的视图状态,也总会有一个表示页面本身的相对较短的字符串。

检查State Management (View State)