技术开发 频道

自定义ExtenderControl实现服务器控件可拖放


【IT168技术文档】

  ExtenderControl是AJAX.NET框架里扩展控件的基类,比如 ControlToolKit里的一些扩展控件就是从这个基类派生而来。这也是AJAX.NET框架提供给用户在客户端定义Behavior的一种方式。这种客户端的Behavior主要用于扩展服务器控件的行为,让服务器控件有更多的客户端功能,提供更好的用户体验。而这种扩展控件的方式是不改变原有服务器的行为,只是新增功能,也算是一种装饰模式。
  这里所做的Extender控件的功能是实现服务器控件在页面上可被拖放,当然这个功能在强大的AJAX.NET的预览版本里已经有了很好的实现,我这里所做的也只是简单的拖放。基本的思路是采用AJAX正式版框架里定义Behavior的方式,然后定义一些模拟拖放的事件。实现拖放的逻辑也很简单,当需要拖放的对象被点击之后,给body添加mousemove和mouseup事件,具体的移动逻辑在mousemove里实现,mouseup 则清空body的事件,拖放结束。这个逻辑也是按照<<javascript高级编程>>书上介绍的方法,没有特别深奥的东西。说白了就是演练一下定义extender控件,把一些老的东西重新包装一下。除了简单的拖放逻辑,还提供了一个属性dragCssClass,就是在拖放的时候的样式,比如设置鼠标为move等等。
  具体代码如下
  1.首先定义个extender继承ExtenderControl,当然这个要引用AJAX.NET的System.Web.Extension.dll.要指定[TargetControlType(typeof(Control))]类型,还需要注册脚本,脚本当然也是嵌入到资源中的。基类方法的作用请看AJAX.NET提供的帮助。
1[assembly: WebResource("AjaxControl.DragBehavior.js", "text/javascript")] 2namespace AjaxControl 3{ 4 [TargetControlType(typeof(Control))] 5 public class DragExtender : ExtenderControl 6 { 7 private string _dragCssClass; 8 /**//// <summary> 9 /// 拖动时的样式 10 /// </summary> 11 public string DragCssClass 12 { 13 get { return _dragCssClass; } 14 set { _dragCssClass = value; } 15 } 16 17 protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors(Control targetControl) 18 { 19 ScriptBehaviorDescriptor descriptor = new ScriptBehaviorDescriptor("Shenba.DragBehavior", targetControl.ClientID); 20 descriptor.AddProperty("dragCssClass", this._dragCssClass); 21 return new ScriptBehaviorDescriptor[] { descriptor }; 22 } 23 24 protected override IEnumerable<ScriptReference> GetScriptReferences() 25 { 26 string jsPath = ResolveClientUrl("AjaxControl.DragBehavior.js"); 27 ScriptReference reference = new ScriptReference(jsPath); 28 return new ScriptReference[] { reference }; 29 } 30 31 protected override void OnPreRender(EventArgs e) 32 { 33 if (!this.DesignMode) 34 { 35 // 将脚本添加到scriptmanager的脚本引用中 36 ScriptManager sm = ScriptManager.GetCurrent(Page); 37 if (sm == null) 38 { 39 throw new HttpException("a scriptmanager is required in the page."); 40 } 41 sm.Scripts.Add(new ScriptReference("AjaxControl.DragBehavior.js", "AjaxControl")); 42 } 43 base.OnPreRender(e); 44 } 45 } 46}
0
相关文章