连续两天搞这个东西,起因是devexpress里的dataview控件,把它包装成一个user control以后,却发现在postback回来后丢失了用户记录的内容,无论是里面的textbox还是dropdownlist。都如此。
第一步,怀疑是update panel的问题,因为之前刚把update panel的ChildrenAsTrigger设成false,后来发现这样做除了要手动在每个postback处理函数里加上UpdatePanel.update()外,没什么本质区别。而且update只能用一次,后面那次失效而不是前面的失效。所以并没有起到限制更新的作用。那我何必呢。
第二步,排除了update panel的原因,认为是viewstate的问题,可是每个开关都设成了enableViewState=true都没有用。遂怀疑是不是它,何况似乎我以前viewstate[]是用来存放不跨页面的变量的,从来不需要用来保持控件状态。一查果然如此,asp.net可以直接从request里读到form提交上来时候的用户记录的控件值。毕竟,textbox和
dropdownlist都是<input>嘛。
第三步,开始走到另一条路上,debug到SaveTextViewState 这个属性,很奇怪dataview里的控件的该属性都是false,而正常的页面控件的该属性都是true。一google确实很多人碰到这个疑问,还有到mono里找源代码解惑的人。可惜,就算我把控件事件给响应了,这个值变成了true,还是不行。。。看来控件的用户信息确实不从viewstate里取啊。或者是可能从viewstate里取,但是我仍然要显式地写到viewstate里。不知道了。
第四步,走到了composite control的方向,参考使用了
override protected void OnInit(EventArgs e)
{
this.EnsureChildControls();
}
结果也是没用,最后还是从第二步里忽然想到,能不能自己从request里取,虽然有些土,觉得这应该是asp.net框架干的。但是it works!
referenece:
http://epasser.aydc.com.cn/article/adp/2/content11225.html
http://www.cnblogs.com/king_astar/archive/2004/09/30/48126.html
http://blogs.telerik.com/blogs/dimitar_kapitanov/archive/2006/01/17/89.aspx
http://lists.ximian.com/pipermail/mono-patches/2003-June/020098.html2007