定制AjaxControlToolkit(1):使一个CalendarExtender对应N个TextBox2011-09-06 博客园 夏狼哉其实像AutoCompleteExtender之类的其它扩展也是与此类似,这里只是用 CalendarExtender举例子了。AjaxControlToolkit确实是个好东西,但是我实在不明白设计者是出于什么 目的一定要把它捆在某一个文本框上,使得这组控件变得很难用。对日期控件来 说,可能很多人用过梅花雨做的那个日期控件,那个控件确实很好用,而且其 setday(this)这样的调用方式也非常简单明了,但是它存在许多问题(跟主题无 关,不再细说),为了说服我的同事转用CalendarExtender,我决定想个办法使 CalendarExtender也能像梅花雨日期控件一样简单好用。由于AjaxControlToolkit天生的设计,不修改AjaxControlToolkit.dll是绝 不可能达到目的的,不过好在微软提供了源代码(不知道应该说感谢微软,还是 应该说感谢多年来坚持呼吁开源的人士- -!),所以修改dll变得一点也不复杂 了。首先,在结构上CalendarBehavior类继承自BehaviorBase类, BehaviorBase 又继承自Sys.UI.Behavior类,这几个类中,CalendarBehavior和BehaviorBase 类存在于AjaxControlToolkit项目中,可以直接修改,但是Sys.UI.Behavior存 在于.NET Framework附带的System.Web.Extension.dll中,所以修改只能止于 BehaviorBase了,要修改Sys.UI.Behavior的话,代价太大,不考虑。但是,偏偏把扩展绑定到一个固定的控件上这个规则,就是Sys.UI.Behavior 定义的!在这个类的构造函数中,把目标文本框传入,此后只能从子类调用继承 的方法get_element()来获取这个文本框,而无法去更改它,因为没有基类 Sys.UI.Behavior的实例,所以访问它的私有属性自然也是不可能的事。本来, 如果给基类增加一个set_element()方法,既简单效率又最高,但是偏偏这个 最佳途径被堵死了。于是只能退而求其次,从CalendarBehavior类身上做文章。为了使目标文本框可以动态地变化,首先给CalendarBehavior类增加一个私 有属性:this._element = element;然后要有读取它的公共方法:
get_targetElement: function() { return this._element;}
把CalendarBehavior类中所有的get_element()方法替换成 get_targetElement()方法,就使得Sys.UI.Behavior没有用武之地了,现在只要 再有一个改变_element私有属性的方法即可大功靠成。