ViewState

      ViewState主要使用了Hidden Control,可以存储Page范围内的数据, 它支持String, Integer, Boolean, Array, ArrayList, HashTable, System.Web.UI.Control 如果要存储一个不同的数据类型,需要自定义类型转换器(Type Converter). 已经包含了一个ViewState,它是StateBag(sealed class)的一个实例.如果从Control继承而来,可以直接使用这个ViewState. 下面分两种情况来讨论
     1.如果我们所写的Control (MyControl), 从Control继承而来,但是包含一个复杂属性HotStyle,而这个属性的类型实现了IStateManager接口,那么我们就应该复写TrackViewState,  LoadViewState, 和SaveViewState来处MyControl的ViewState和HotStyle,来不断调用处理每一层的ViewState.
       2.如果我们想使客户端的改变有可能存储下来, 放到ViewState中去,比如一个Button,我们想记录它移动的功能,用户可以在Browser上移动这个button,而我们还想记录这个移动的位置,等下一次postback回来,这个位置也会发生改变,那么最好的办法就是:
                  MyControl: Control, IPostBackDataEventHandler (MyControl实现IPostBackDataEventHandler接口)
                  注册一个hidden control, 每个Control都有一个Page属性,而Page class有一个RegisterHiddenField方法注册一个Hidden Control,应该与Control.UniqueID配合使用来确保name的唯一性. 每当button位置在Browser上改变以后,就用javascript记录在这个Hidden Control中
                  然后当postback时,使用bool LoadPostData (
                                                                  string postDataKey,
                                                                  NameValueCollection postCollection ), postCollection来获得HiddenControl里的value,比较变化,保持新值到ViewState中, 然后返回true or false, 来决定是否调用RaisePostDataChangedEvent . 这客户端的更新也就能反映到Server端了,并保持到了ViewState上,等Render的时候,在把Button的位置改变,就可以了.需要注意的是postCollection对所有在同一Page上的Control,是同一个引用,它就是整个Page上面的name/value字典, 所有同一Page上实现IPostBackDataEventHandler接口的Control保持对它的引用一致.
       ViewState的存储,可以通过覆写Page.LoadPageStateFromPersistenceMedium 和page. SavePageStateToPersistenceMedium来使ViewState不要存储在Page上,而存储在其它地方,来节省带宽.这也是Asp.net可以进行优化的一个切入点.

posted on 2007-07-11 11:57  redpeachsix  阅读(357)  评论(0编辑  收藏  举报

导航