让ModalPopupExtender的控制控件能响应服务器事件


在微软的ajax实现中,一部分是服务端的,也是核心部分,用于控制整个请求的周期。这部分是与原服务器控件结合最紧密的。这部分会托管控件的请求事件。

而另一部分是在前一部分进行扩展的,虽然有些会使用异步与服务器通信,但是更多的部分则是纯客户端脚本的封装。这一部分能大大增强我们的客户端体验。

从生成的代码中我们也可以看出,如果是ajax服务器控件生成的一个有异步通信功能的代码,并没有在触发这个事件的按钮或者链接上更改任何的代码,还是原来的__doPostBack('','')回发方式。ajax核心部分会托管这个__doPostBack。而对于ajax control toolkit,则是在初始化真个客户端页面时执行一段代码然后动态的给绑定的控件加入触发的代码。所以你也看不到例如一个LinkButton触发事件的变化。

昨天为一个页面添加一个ajax,在点击一个“编辑CSS”的LinkButton后,弹出一个ModalPopupExtender定义的一个Panel,然后从服务端或者CSS内容,填充这个模态对话框中的一个TextBox。所以这里的LinkButton要完成两个动作:弹出模态框和触发服务器事件。

这出现了一个矛盾,如果你的LinkButton同时有一个异步请求的事件,同时也绑定了例如ModalPopupExtender这样的控件,那么你这个LinkButton会响应ModalPopup,如你所料的弹出一个模态框,但是你想回发服务器并异步或者数据的想法并没有实现,因为这个LinkButton的href已经不是你看到的__doPostBack这样的方法了,所以这个能看得到的__doPostBack根本不会被执行。有什么办法可以解决呢?我们首要的问题是要点击这个LinkButton时能够触发LinkButton的这个__doPostBack,而LinkButton的href在客户端初始化时会被替换,所以我们不能在href这里下手。很自然的我们想到onclick这个事件,经过实验我们可以发现LinkButton的onclick并不会被客户端修改。那么要触发这个LinkButton的__doPostBack也是轻而易举了。我们只需在服务端的Page_Load中加入这个LinkButton的OnClientClick:

editCssBtn.OnClientClick = "__doPostBack('" + this.editCssBtn.UniqueID + "','')";

简单的一句就实现了服务器事件的触发,这样LinkButton就可以兼做二用了。


上面的描述是我在实现时体会的,可能不一定对,大家多多包涵。同时是不是可以直接设置的因为时间匆忙我就没有研究了。欢迎大家指出。
posted @ 2007-06-18 14:10  ggdesign  阅读(1773)  评论(2编辑  收藏  举报