关闭Viewstate

转自:http://hi.baidu.com/zagelover/blog/item/c829dd18465cc6b24aedbc39.html
我的前面一个文章中提到了asp.net如何管理状态,这里有一个应用的实例。当我们使用很多servercontrol的时候或者servercontrol的数据比较多的时候,有时候我们会发现浏览器想客户端提交的数据量大的超出我们的想象,如果你做的事一个小应用无所,如果你做的是关键应用,或者公网应用,你就会发现受不了了,如果一个页面自己提交以下就上百k,折合成网络传输就是1M,那么你需要多大的带宽啊。

怎么办呢?Asp.net2.0提供了一个enableviewstate的控件属性,使得我们可以关闭viewstate,减少浏览器到服务器的数据传输量,那么,这个东西怎么样呢?

看这个例子:   

 

    protected void Page_Load(object sender, EventArgs e)
    {
        
if (!this.IsPostBack) 
        { 
            DropDownList1.Items.Add(
"dd1"); 
            DropDownList1.Items.Add(
"dd2"); 
            DropDownList1.SelectedIndex 
= 0
        }
    }

    
protected void Button1_Click(object sender, EventArgs e)
    {
        
int i = DropDownList1.SelectedIndex; 
        i 
= DropDownList1.Items.Count;
    }

1。如果enableviewstate=true,显然是正确的,当button click的时候,IsPostBack=true,不会给DropDownList1再次赋值;;Viewstate="/wEPDwUJMjU2NjMzNzY5D2QWAgIDD2QWAgIFDxBkDxYCZgIBFgIQBQNkZDEFA2RkMWcQBQNkZDIFA2RkMmdkZGTtIIu8ebWaFhzv4IWvgZWfL++vYA=="

2。如果enableviewstate=fasle,Viewstate="/wEPDwUKLTU1NjAxNjM5NWRkwyZK+jXFlf1ONOZERfpuPpvR8sg=" 显然,小了很多。但是,无论用户如何选择,DropDownList1.SelectedIndex=-1,而且DropDownList1是空的,所以不对,

3。但是如果将DropDownList1.Items.Add("dd1");DropDownList1.Items.Add("dd2");放到if (!this.IsPostBack)的外面,还是不对,这个时候虽然DropDownList1不空,但是用户选择的结果无法传递过来viewstate和2相同

4。如果将DropDownList1.Items.Add("dd1");DropDownList1.Items.Add("dd2");取消,然后在设计状态给DropDownList1赋好值,就对了Viewstate差不多这说明实际上controlstate还是其作用了,虽然没有viewstate,但是用户选择了什么还是有的,只不过按照前面的方法去做,在pageload之前,controlstate已经取出来了,可是当时的DropDownList1还没有赋值,所以没有存进去,这就说明在viewstate关闭的情况下,在page_load里面给控件赋值是有风险的

5。大多数情况下用户肯定是从数据库等地方取出东西动态赋值给DropDownList1,所以怎么解决呢?我们找别的事件    protected override void OnInitComplete(EventArgs e)    {        DropDownList1.Items.Add("dd1");        DropDownList1.Items.Add("dd2");    }

msdn:In this stage of the page's life cycle, all declared controls on the page are initialized, but the page's view state is not yet populated. You can access server controls, but they will not yet contain information returned from the user.所以这个状态下还没有viewstate,controlstate,所以可以先绑定,绑定完毕后asp。net就会把controlstate给这个控件了

6。所以,关闭了viewstate,虽然关键信息还可以使用,但是很多东西发生了变化,尤其是给控件初始化数据的时机就不一样了,按照上面的方法虽然可以了,减少了viewstate网络传输的量,但是可以看到,每一次调用,无论是postback还是非postback,都需要重新绑定,如果数据从数据库来,其实就是加重了数据库的负担,所以,是否关闭viewstate实际上是在网络和数据库性能上做一个折中选择。最关键的,程序写法会发生变化。所以,viewstate最适合关闭的场景还是dbgrid之类的只是显示用的东西,如果要回传用户选择修改的内容,就比较麻烦了。

7。当然,还有一个做法是,我们可以在客户端写脚本,如果用户选择了什么,我们就放到一个hidden元素里面去,倒是后把这个hidden提交了就是了,但是这样就失去了server控件的很多优势了

8。另外,像textbox之类的,就不需要这么麻烦了,测试表明无论是否禁用viewstate,都没有什么变化,我想这是因为,textbox在客户端就是一个标准的input,他的text是不需要asp.net使用viewstate来处理的,其他的属性我就没有尝试了。但是如果看看checkbox就明白了,如果关闭了它的viewstate,我们是可以取到他的value的,但是服务端动态设置它的text就回不来了。

posted on 2009-08-27 22:36  王培  阅读(565)  评论(0编辑  收藏  举报

导航