技术开发 频道

Tomcat 5集群中的SESSION复制一

    我这里使用的是相对最容易的做法。我们既然可以在页面上反复DOM元素,自然也可以反复脚本代码。在ItemTemplate中的脚本代码很容易,其关键在于通过每一项的Container来找到其中的HoverMenuExtender,获得其BehaviorID,接着通过BehaviorID找到HoverMenuBehavior对象,并为它们响应shown事件(值得注意的是,添加事件响应方法是在load阶段中进行,因为那些Behavior对象是在init阶段中创建的)。每当鼠标滑过某个<a />元素时,其对应的HoverMenuBehavior对象的shown事件将被触发,onShownHandler方法会被执行,而其第一个参数sender即为当前触发事件的HoverMenuBehavior对象。于是我们调用HoverMenuService的GetContent方法用于获得填充内容。

    还是看看最后在页面上生成的代码。有时候对于开发人员来说,直接阅读代码会更容易理解一些东西:

<a id="Repeater1_ctl00_link">Hover on me!</a>
<div id="Repeater1_ctl00_tooltip" style="...">
Loading...
</div>
<script language="javascript" type="text/javascript">
Sys.Application.add_load(function(sender, args)
{
if (args.get_isPartialLoad()) return;
var behaviorId = 'Repeater1_ctl00_hoverMenu';
$find(behaviorId).add_shown(onShownHandler);
})
</script>

<hr />

<a id="Repeater1_ctl02_link">Hover on me!</a>
<div id="Repeater1_ctl02_tooltip" style="...">
Loading...
</div>
<script language="javascript" type="text/javascript">
Sys.Application.add_load(function(sender, args)
{
if (args.get_isPartialLoad()) return;
var behaviorId = 'Repeater1_ctl02_hoverMenu';
$find(behaviorId).add_shown(onShownHandler);
})
</script>
...

    不知是从AjaxControlToolkit的哪个版本开始,如果不设置Extender的BehaviorID,就会把Extender控件的ClientID作为BehaviorID了。根据Microsoft AJAX Library创建Component的规则,如果Component在创建时不提供ID,那么就不会在Sys.Application的某个集合中保持那个Component对象的引用,也就是说我们无法通过$find方法来获得它了。如果我们不需要在客户端操作那个Component对象,这并没有任何影响。而如果真的需要操作时,也只需在Extender中将BehaviorID设为特定的值即可。目前自动分配BehaviorID的做法,我估计就是为了解决类似Repeater这样的控件中使用Extender的情况,因为在这种情况下,我们不能在模板中指定Extender的BehaviorID,因为这样就会在客户端创建相同ID的Component——这是不允许做法。当然,我们还是有解决方法的,例如我们可以响应Repeater的ItemDataBound事件,然后在事件每次被触发时为当前Extender的BehaviorID设置唯一的值即可。

    结论

    AjaxControlTookit中控件的关键在于客户端的Behavior对象,Behavior对象大都有丰富的属性,方法和事件。在目前的版本中,为某些Behavior添加Event Handler并非一件很容易的事情。相信今后的AjaxControlToolkit版本中将会为一些较早的Extender补充对于客户端事件的支持,让我们拭目以待吧,只是眼下我们还需要使用一些技巧来实现功能了。不过,我们完全可以自己修改AjaxControlToolkit的代码,又何必等到官方的发布呢?

0
相关文章