Understand of the ViewState
2011-12-28 21:09
375 查看
相信大家对ViewState都不陌生,网上关于ViewState的文章已是满天飞舞,但是本人一直没有认真对待过这个东东,直到最近才有机会好好学习,天天向上。特将Truly-Understanding-Viewstate文章中的例子提取出来。
(一)我们需要按照下列的3种方式建立3个不同的页面来测试ViewState产生:
Page1:
Page2:
Page3:
问题如下:
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==" />
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并输出到了客户端。
全文如有不当之处,敬请指正。
<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并输出到了客户端。
全文如有不当之处,敬请指正。
相关文章推荐
- Getting the most out of your pixels - adapting to view state changes(WIN8下设计适应多种分辨率的APP)[转.原]
- A internal server error like "stack overflow" can cause the exception of "Validation of viewstate MAC faild"
- Preserving the state of an Android WebView on screen orientation change
- ADF_FACES-30108:The view state of the page has expired because of inactivity. Reload the page
- Search Engine Optimization - Moving View State to the bottom of the page
- Preserving the state of an Android WebView on screen orientation change
- Server-02 To view the connection number of shared folder in windows OS
- 【iOS】The behavior of the UICollectionViewFlowLayout is not defined because:
- The Adapter of ListView: Just adapt data to view, don’t do anything else
- failed to sync branch You might need to open a shell and debug the state of this repo
- How to popup a UIPickerView from the bottom of a UIScrollView in response to UITextField selection
- Change the Default View of AJAX Calendar Control
- Asp.Net2.0验证视图状态 MAC 失败 ( Validation of viewstate MAC failed )
- How to provide the capability to expand empty rows of a master view to be able to add child rows
- 7.2 Handling the Events of a Map View
- The state of my heart
- How can I set the background of UITableView (the tableview style is "Grouped") to use an image?
- Taking a Bite Out of ASP.NET ViewState
- View the start/end of a file linux
- How do I add new state and change the workflow of Purchase Order?