您的位置:首页 > 其它

Understand of the ViewState

2011-12-28 21:09 375 查看
相信大家对ViewState都不陌生,网上关于ViewState的文章已是满天飞舞,但是本人一直没有认真对待过这个东东,直到最近才有机会好好学习,天天向上。特将Truly-Understanding-Viewstate文章中的例子提取出来。

(一)我们需要按照下列的3种方式建立3个不同的页面来测试ViewState产生:

Page1:

<form id="form1" runat="server">
<asp:label id="label1" runat="server" text="abc" />
<asp:button id="button1" runat="server" text="Postback" />
</form>



Page2:

<form id="form1" runat="server">
<asp:label id="label1" runat="server" text="We the people
of the United States,         in order to
form a more perfect union, establish justice, insure
domestic tranquility, provide for the common defense, promote the
general welfare, and secure the blessings of liberty to ourselves and
our posterity, do ordain and establish this Constitution for the United
States of America." />
<asp:button id="button1" runat="server" text="Postback" />
</form>



Page3:

<form id="form1" runat="server">
<asp:label id="label1" runat="server" text="abc" />
<asp:button id="button1" runat="server" text="Postback" />
</form>



protected void Page_Load(object sender, EventArgs e)
{
label1.Text = @"We the people
of the United States, in order to form a more perfect union, establish justice,
insure domestic tranquility, provide for the common defense, promote the general
welfare, and secure the blessings of liberty to ourselves and our posterity, do
ordain and establish this Constitution for the United States of America.";
}



问题如下:

1  第一个页面点击按钮刷新后,ViewState是否有变化?

2  第二个页面点击按钮刷新后,ViewState是否有变化?ViewState的长度是否和1一致?

3  第三个页面点击按钮刷新后,ViewState是否有变化?ViewState的长度是否和1一致?

答案很简单,各位感觉不确定的自己去试验即可。

Page1:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MWRkIHuXE3R8Wib1wkt+y4hhUM3g2TaYceBvFId9PyA5JuA=" />

Post Back 后,

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MWRkIHuXE3R8Wib1wkt+y4hhUM3g2TaYceBvFId9PyA5JuA=" />

Page2:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MWRkb/QZZ8060nEBCRlfLmJChbil7FP1+3QNDlNNiAPXqGg=" />

Post Back后

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MWRkb/QZZ8060nEBCRlfLmJChbil7FP1+3QNDlNNiAPXqGg=" />

Page3:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFkgNXZSB0aGUgcGVvcGxlIG9mIHRoZSBVbml0ZWQgU3RhdGVzLA0KwqDCoMKgIMKgwqDCoCBpbiBvcmRlciB0byBmb3JtIGEgbW9yZSBwZXJmZWN0IHVuaW9uLCBlc3RhYmxpc2gganVzdGljZSwgaW5zdXJlDQrCoMKgwqAgwqDCoMKgIGRvbWVzdGljIHRyYW5xdWlsaXR5LCBwcm92aWRlIGZvciB0aGUgY29tbW9uIGRlZmVuc2UsIHByb21vdGUgdGhlDQrCoMKgwqAgwqDCoMKgIGdlbmVyYWwgd2VsZmFyZSwgYW5kIHNlY3VyZSB0aGUgYmxlc3NpbmdzIG9mIGxpYmVydHkgdG8gb3Vyc2VsdmVzIGFuZA0KwqDCoMKgIMKgwqDCoCBvdXIgcG9zdGVyaXR5LCBkbyBvcmRhaW4gYW5kIGVzdGFibGlzaCB0aGlzIENvbnN0aXR1dGlvbiBmb3IgdGhlIFVuaXRlZA0KwqDCoMKgIMKgwqDCoCBTdGF0ZXMgb2YgQW1lcmljYS5kZGR6ZVCEUNhFlI5tV0Lnu+/S5R/AQHtVj10gBnu4LW0Kpw==" />

Post Back后

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFkgNXZSB0aGUgcGVvcGxlIG9mIHRoZSBVbml0ZWQgU3RhdGVzLA0KwqDCoMKgIMKgwqDCoCBpbiBvcmRlciB0byBmb3JtIGEgbW9yZSBwZXJmZWN0IHVuaW9uLCBlc3RhYmxpc2gganVzdGljZSwgaW5zdXJlDQrCoMKgwqAgwqDCoMKgIGRvbWVzdGljIHRyYW5xdWlsaXR5LCBwcm92aWRlIGZvciB0aGUgY29tbW9uIGRlZmVuc2UsIHByb21vdGUgdGhlDQrCoMKgwqAgwqDCoMKgIGdlbmVyYWwgd2VsZmFyZSwgYW5kIHNlY3VyZSB0aGUgYmxlc3NpbmdzIG9mIGxpYmVydHkgdG8gb3Vyc2VsdmVzIGFuZA0KwqDCoMKgIMKgwqDCoCBvdXIgcG9zdGVyaXR5LCBkbyBvcmRhaW4gYW5kIGVzdGFibGlzaCB0aGlzIENvbnN0aXR1dGlvbiBmb3IgdGhlIFVuaXRlZA0KwqDCoMKgIMKgwqDCoCBTdGF0ZXMgb2YgQW1lcmljYS5kZGR6ZVCEUNhFlI5tV0Lnu+/S5R/AQHtVj10gBnu4LW0Kpw==" />

(二)ViewState是什么时候生成的?什么情况下控件状态改变不生成ViewState?

首先看下控件相关的生命周期:

OnInit

……

TrackViewState

OnLoad                     Page_Load 里面改变了ViewState的值,就被自动将IsDirty属性设为true.

OnPreRender

SaveViewState         这里就将ViewState写入了页面

Render

……

关于 TrackViewState

MSDN曰:

This method is called automatically at the end of the Init event in the server control's lifecycle.

作用是让StateBag开始跟踪StateItem的变化,任何变化都将导致该StateItem的IsDirty属性变为true。

在OnInit之前,IsDirty属性是false的,并且无论你如何设置Value属性的值都不会改变IsDirty属性。在OnInit之后,IsDirty属性也保持着false,直到你第一次改变Value属性的值(指通过this.ViewState[key]的方法改变)。到了SaveViewState的阶段,只有IsDirty属性为true的StateItem才会被保存下来。

这里关键是TrackViewState ,相当于打开一个视图状态跟踪功能。功能开了,任何变化都会记录。这个具体是如何跟踪变化的哪位大侠有过研究的请不吝赐教!

再回过头去看Page 3..  TrackViewState 和SaveViewState  之间,那个谁谁谁已经污秽了,自然就生成了ViewState并输出到了客户端。

全文如有不当之处,敬请指正。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐