关于控件生命周期中的装载和保存视图阶段

也就是LoadViewState()和SaveViewState()

所有Web控件大都派生自Control类,Control类有一个ViewState属性,它是一个StateBag类的对象。控件可以有多个属性,每个属性都有一个值,
StateBag对象按照“Key-Item”格式管理这些数据,一般将属性名当作Key。Item则封装了对应属性的值 (注意它是一个StateItem类型的对象)。

一。对于LoadViewState()
 在所有的相关资料中都是这样说的:(仅用于回传过程)(Load View State (postback only)),这个阶段发生在回传时,而不是初始请求过程中。
        不是初始请求过程中,也就是我们通过URL请求页面时,服务器端的动作如下:
 实例化一个页类,
 (一)实例化控件类(Instantiate)
 (二)初始化(Initialize)
 (三)开始跟踪视图状态(Begin Tracking View State)
 这里又分两种情况,赋予初值,或没有赋值
 赋予初值时,创建一个对象加入到集合中
 没有赋值时,且不要求跟踪,则从StateBag对象的集合中移除此对象
 然后再设置监控控件属性是否改变的标志,第一次设置自然是false.

 (四)由于视图状态尚未保存,自然就不进行加载视图状态,同样不存在客户端的页面回发,也就不存在数据回传和事件回传,也不存在加载回传数据,
而是直接到了加载(Load)
 (五)同样也就不存在引发修改事件,和引发回传事件。
 (六)预生成(PreRender)
 (七)保存视图状态(Save View State)是将控件的当前状态抽取为一个状态对象,页面类获取所有控件的状态对象对其进行编码生成可在网络上传输的
格式(Base64),并将其塞入到一个id为__VIEWSTATE的input元素中发给浏览器。如果属性没有设置初值,则没有视图状态保存,如果设有初值,其监控控件属
性是否改变的标志是false.则SaveStateView()则不处理它,仍然是没有视图状态保存。
 (八)生成(Render)
 (九)卸载(Unload)
 (十)释放(Dispose)

 注意:如果是在第一次页面发送到Web服务器(页面回传,或回发),也就提交了web表单(页面当前控件的值)和隐藏字段"__VIEWSTATE"(包含了上次
控件的状态)。这时没有视图状态保存,自然无须加载视图状态。如果表单中控件的属性值跟_VIEWSTATE中的值不一样,则会加载回传数据,StateBag对象的集合
中对应Item的监控控件属性是否改变的标志将变成True, SaveStateView()会将Item保存在__VIEWSTATE中,然后发送到客户端。当以后的页面发送到服务器端时,
LoadViewState()每次都会执行了。而如果表单中属性值跟_VIEWSTATE中的值还是一样,则StateBag对象的集合
中对应Item的监控控件属性是否改变的标志则还是false,则SaveStateView()则还是不处理它,仍然是没有视图状态保存。则第二次页面发送到Web服务器,
LoadViewState()还是不会执行。

控件的SaveViewState()方法在生成状态对象时就会将此属性的修改记录下来。简单地说:只有IsDirty=true的属性值才会被 SaveViewState()方法处理。
这就避免了为控件所有的属性都生成状态数据,大大减少了要保存的数据量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值