三种asp.net 2.0的AJAX方法比较

一种是用Page.ClientScript.GetCallbackEventReference + ICallbackEventHandler
接口。

一种是update Panel+ScriptManager.RegisterDataItem。

一种是直接使用javascript+WebService的类和方法,通过 <asp:ServiceReference path=”~\WebService\SimpleWebService.asmx” />引入。

功能上,三者都可以实现AJAX。第一个方法的GetCallbackResult不能返回复杂对象,而且只能返回一个字符串,从扩展的角度,算是一个致命缺陷。第二种方法可以返回多个字符串参数,但不如第三者的直接返回对象更灵活。

1<2<3

而从使用的方便性上,如果程序中一个结果导致多个控件发生改变,显然用javascript去操作并不轻松,所以第一种方法和第三种都不如第二种那样可以先在服务器端处理再返回。而如果不利用asp控件在服务器端编程的便利性,单从调用webservice的角度,第三种方法扩展性更好,如果一个页面有多个AJAX需要ICallbackEventHandler 接口来处理怎么办呢?好吧,查了一下还是可以用RaiseCallbackEvent的参数来进行switch的。那么在client script上两者要写的注册代码差不多。

1=3<2

这样的话,平时用AJAX,建议在2和3之间选择。就我个人而言,我觉得没有理由传送太复杂的对象给javascript处理,因为逻辑放在服务端,客户端的复杂对象也就是用来触发页面不同的控件,用RegisterDataItem也就可以触发,虽然没有复杂对象那么美。甚至没有1的context那样的方便(context可以直接用于传递原上下文环境)。但方法2的好处在于服务器端方便性上,服务器端控件还是在服务器端做事情方便。有自动完成,有方法参考,还可以debug.当然如果是js高手就不一样了。2008

丢失的控件信息

连续两天搞这个东西,起因是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

New和Override的区别

忽然发现,这么基础的问题原来我不懂啊。。。

new即什么都不写直接覆盖,但是并不是最强制的下层覆盖上层,不像override可以聪明地找到对象所在的层。

忽然想到,如果我多加几层,采用virtual-new-override-new的形式,类似连接中的例子,只是数组改为第二层的类型,而一个第四层的元素的describe方法会调用哪一层的方法呢?肯定不是第四层,因为new不会识别该对象的层数到第四层,问题是直接调用第二层的方法呢?还是多少受第三层的override影响呢?有空的时候可以试一下。谁知道告诉我。

http://msdn2.microsoft.com/en-us/library/ms173153(VS.90).aspx