Jews

【Oracle dba,人类心理行为学,人类记忆学,e文学习】 【ASP.NET Team:27565311 】 【Oracle dba Team:53489331 加入请说明原因】

  博客园 :: 首页 ::  :: 订阅 订阅 :: 管理
  115 Posts :: 1 Stories :: 1888 Comments :: 46 Trackbacks

主题,控件的viewstate状态

一“七七八八”

有次,朋友开玩笑说,不知道什么时候,微软会取消viewstate,不再使用隐藏字段在服务器与客户端保存状态!虽然,可以使用客户端技术减少一些回传,但是,一些必要的服务器状态还是要保存的,现在网络带宽已经不是问题,所以在网络上适当的传递一些状态数据,还是可以容忍的!当然,如果终端是mobile,可以考虑把viewstate保存到服务器上!

二“误解viewstate”

    园子里,有不少描写viewstate的文字,也看了不少,知道Viewstate实现了IStateManager接口的一个属性和三个方法!刚接触“她”的时候,一直以为control对象直接实现了IStateManager接口,模糊的记得好象有几个LoadViewstate和SaveViewstate方法,也没有在意方法有没有override修饰!后来发现不是这样的,control并没有直接实现IStateManager接口,而是通过定义一个StateBar类型的Viewstate属性,委托Viewstate属性去管理状态,也就是让StateBar类型去真正实现状态的管理,这种方式可以使控件本身和viewState的实现完全分离!也许,这些经验,对高手谈不上是“经验”,希望刚入门的同仁能少走点弯路!

三“结合Style样式,浅谈Viewstate”

Viewstate属性能装载的数据类型比较有限,但是有些不能加载的类型怎么办呢?当然是重写IStateManager了,然后WebControl委托给ControlStyle属性来管理状态,有点象WebControl定义ViewState属性J
还是从简单的入手吧,直接使用Style类型的状态管理
目标,定义一个文本框和一个按钮的复合控件
要点,分别给文本框和按钮各自定义样式,并提升她们为顶级样式属性
图一



图二 (文本框和按钮的样式)

图四 Demo
Code
Demo比较简单,在类顶部定义了两个Style类型的属性,然后重写维护状态的三个方法一个属性
注意
1.这里并不是直接重写IStateManager接口
2.重写 SaveViewState 方法以将附加样式属性保存到
ViewState
3.重写 LoadViewState 方法以自定义从 ViewState 的附加样式属性的还原
4.必须以添加它们的相同顺序检索



四 控件状态的细节远不只是这些,有不妥当的地方,还望同仁指出...(后续)
posted on 2008-04-08 09:08 Jews 阅读(3770) 评论(25)  编辑 收藏 网摘 所属分类: [3] asp.net Controls

Feedback

是StateBag吧
  回复  引用  查看    

#2楼 2008-04-08 09:18 生鱼片      
博主的光头好帅,呵呵
  回复  引用  查看    

#3楼[楼主] 2008-04-08 09:18 王孟军!      
@生鱼片
:)


  回复  引用  查看    

#4楼 2008-04-08 09:20 ZH-CN      
--引用--------------------------------------------------
生鱼片: 博主的光头好帅,呵呵
--------------------------------------------------------
哈~

  回复  引用  查看    

#5楼 2008-04-08 09:26 Jeffrey Zhao      
没法取消的,总归要留在一个地方,或者客户端或者服务器端。
  回复  引用  查看    

#6楼 2008-04-08 09:29 BlueMountain      
MVC,no viewstate.
  回复  引用  查看    

#7楼[楼主] 2008-04-08 09:45 王孟军!      
@BlueMountain
状态和MVC不能混为一谈
MVC中也还是需要状态维护的

  回复  引用  查看    

#8楼 2008-04-08 10:24 天生俪姿      
不错的文章
public event EventHandler ButtonClick
{
add
{
Events.AddHandler(EventButtonClick, value);
}
remove
{
Events.RemoveHandler(EventButtonClick, value);
}
}

这种方法 第一次见到。是不是 和 += -= 时执行的效果一样呢?

  回复  引用  查看    

#9楼[楼主] 2008-04-08 11:16 王孟军!      
@天生俪姿
没错,效果一样



  回复  引用  查看    

#10楼 2008-04-08 11:37 Zhuang miao      
:-)
  回复  引用  查看    

#11楼 2008-04-08 13:05 李涛      
@生鱼片
深有同感啊,真的很帅。

  回复  引用  查看    

#12楼 2008-04-08 13:09 巫云      
@Tristan(Guozhijian)
我记得也是StateBag

  回复  引用  查看    

#13楼[楼主] 2008-04-08 13:15 王孟军!      
@巫云
@Tristan(Guozhijian)
你们都说得没错,StateBag实现了IStateManager接口
----引用"也就是让StateBar类型去真正实现状态的管理"
上面是我的原话,可能字太小,弄得你没看见,抱歉

@李涛
可惜涛哥不是女孩子...

  回复  引用  查看    

#14楼 2008-04-08 14:14 没有昵称      
Viewstate属性能装载的数据类型还是非常多的吧,只要加了SerializableAttribute标签的类都可以。即便遇到别人没注意没打标签的,弄个Wrapper继承一下或者包含一下,在Wrapper上打个标签就又可以了。
  回复  引用  查看    

#15楼[楼主] 2008-04-08 15:23 王孟军!      
@没有昵称
1.你看一下Viewstate能装载哪些类型...
2."只要加了SerializableAttribute标签的类都可以",就可以维护状态吗?非也

  回复  引用  查看    

#16楼 2008-04-08 19:04 丁一      
个人觉得 StateBar 给我们提供了一个客户端存储数据的"空间".
而这个"空间"是由 IStateManager 来管理的,
至于什么时候管理是由 ASP.NET 自动执行的.

  回复  引用  查看    

#17楼 2008-04-09 09:30 xieex      
请问:
在LoadViewState方法中判断 if (myState.Length != 3)是不是因为前面将两种样式保存到了ViewState中去了,如果保存了三种样式,那么是不是要判断
if (myState.Length != 4)了呢?

如果是三种,LoadViewState方法是不是可以这么写?
Triplet triplet = (Triplet)savedState;
base.LoadViewState(triplet.First);
((IStateManager)TextBoxStyle).LoadViewState(triplet.Second);
((IStateManager)ButtonStyle).LoadViewState(triplet.Third);

  回复  引用  查看    

--引用--------------------------------------------------
xieex: 请问:
在LoadViewState方法中判断 if (myState.Length != 3)是不是因为前面将两种样式保存到了ViewState中去了,如果保存了三种样式,那么是不是要判断
if (myState.Length != 4)了呢?

如果是三种,LoadViewState方法是不是可以这么写?
Triplet triplet = (Triplet)savedState;
base.LoadViewState(triplet.First);
((IStateManager)TextBoxStyle).LoadViewState(triplet.Second);
((IStateManager)ButtonStyle).LoadViewState(triplet.Third);

--------------------------------------------------------
SaveViewState怎么保存,LoadViewState就怎么读,用Triplet和数组都能实现lz的这个功能,格式应该不是重要的,Triplet倒是微软的标准用法,如果要保存的对象为三个的话,用Triplet可能更好看些,呵呵。

  回复  引用  查看    

#19楼[楼主] 2008-04-10 08:40 王孟军!      
@王庆
thanks


  回复  引用  查看    

#20楼 2008-05-28 11:36 feng173      
请问一下楼主,为什么在render中能够获取到_textBox实例
  回复  引用  查看    

#21楼[楼主] 2008-05-28 15:07 王孟军!      
@feng173
因为在 CreateChildControls方法中,已经事例化了TextBox对象

  回复  引用  查看    

#22楼 2008-05-28 19:54 feng173      
但是我还是不明白CreateChildControls()是什么时候调用的,为什么不在Render()中显示调用EnsureChildControls()来确保子控件已成功创建,防止出现空隐用

  回复  引用  查看    

ViewState["CurrentSortField"] = value;
这个value的植怎么得的

  回复  引用    

#24楼[楼主] 2008-08-07 11:40 王孟军!      
@jinglong
这位兄弟,这个就是属性的值,没什么奥秘
比如
private string name;
public sring Name
{
get{return value;}
set{this.name=value;}
}

  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1141545




相关文章:

相关链接: