1、分析

不知道大家在使用ASP.NET AJAX Control Toolkit里的各个Extender控件时,有没有接触过ResolveControlID事件?这个事件在官方也只用了很少的笔墨来描述。的确,这个事件不太常用,看看ASP.NET AJAX的演示站点,根本没有使用过ResolveControlID事件。

那么这个事件难道没有什么用吗?其实不然。这个事件原本不存在于ASP.NET AJAX中,是ASP.NET AJAX Control Toolkit为了方便Extender的开发,而是现在ExtenderControlBase类里的。ASP.NET AJAX Control Toolkit是个非常重要的东西,他提供的ExtenderControlBase类基于ASP.NET AJAX中的ExtenderBase类,提供了许多有用的扩展,大大方便了Extender的开发。ResolveControlID事件就是其中一个。它的作用是帮助Extender找到它需要的控件。

每个Extender控件都会有XXXXID属性(例如TargetControlID),它们在开发是都会使用IDReferenceAttribute进行标注,这说明这些属性的“含义”并非只是一个简单的字符串,它们的作用是表示一个控件。换句话说,就是在Extender工作时提供它所需要的各个控件。大家平时在使用Extender控件时,往往会把Extender和它需要的控件放在同一个Web User Control或者Page中,这时只要为那些ID属性指定对应的控件ID即可。但是如果Extender需要的控件和Extender本身并不在同一个Web User Contorl或Page中时,该如何告诉Extender,应该使用哪些控件呢?

这就是ResolveControlID事件的作用了。如果要说得更加“专业”一些,ResolveControlID事件的作用是帮助Extender找到不同Naming Container中的控件。Naming Container是ASP.NET页面模型的概念,它提供了一种“容器”,目的是能够封装一些控件,使不同容器间的控件不会因为某些原因而产生冲突(例如服务器端ID)。有了Naming Container,我们可以在页面上放置多个Web User Control,而每个Web User Control中很有可能会有相同服务器ID的控件,但是它们不会互相冲突。一个Naming Container就是一个实现了INamingContainer接口的控件,它没有任何方法,它的作用仅仅是为了“标记”。我们平时接触的Control类和Page类都是先了这个接口,也就是说它们都是Naming Container。

如果我们在浏览器中查看页面中HTML元素的ID,经常可以发现有“xxxx$xxxx$xxx…”这种形式的ID,这也是Naming Container的作用,它也能保证了每个HTML元素的客户端ID的唯一性。而控件的客户端ID可以通过它在服务器端的ClientID属性获得,不过这就是另外的话题了。

那么ResolveControlID事件是如何生效的呢?ResoveControlID的“事件”参数类型为ResolveControlEventArgs类型,它有一个可写的Control属性。当Extender无法在自己所在的Naming Container中找到控件时,就会触发ResolveControlID事件,然后使用“事件”参数的Control属性作为找到的控件。我们要做的就是在响应这个事件时设定ResolveControlEventArgs.Control属性,给定合适的控件。

其实ResolveControlID事件就是这么简单。

2、示例

其实听了上面的描述,相信大家已经知道如何响应ResolveControlID事件了。不过在这里,我想用一种比较统一的解决方案来实现ResolveControlID。

Naming Container其实也就是包含了其它控件,自然可以是别的Naming Container,因此会形成了“级别”。我们不如把这样的“级别”通过指定Extender的那些ID属性描述出来,然后可以顺着Naming Container的级别一直找下去。具体的做法,我们通过一个使用ModalPopupExtender的示例来看一下吧。

首先,我们要形成不同的Naming Container。那么在这里,我们把弹出的Panel、OK Button以及Cancel Button放在一个Web User Control中,如下:

<asp:Panel ID="ModalDialogPanel" runat="server" Width="300" style="padding: 10px; border:solid 1px black;">ASP.NET AJAX is a free framework for building a new...<br /><br /><asp:Button ID="OkButton" runat="server" Text="OK" /><asp:Button ID="CancelButton" runat="server" Text="Cancel" />
</asp:Panel>

然后就在Page里使用ModalPopupExtener了,请注意,我们为那些ID属性指定了使用逗号分割的字符串,这种方法就表示了Naming Container的级别。例如PopupControlID为“ModalDialog, ModalDialogPanel”,就表示了弹出的控件是ID为ModalPopupDialog的Naming Container(ModalDialog控件)里的ModalDialogPanel控件(可以在ModalDialog.ascx文件中找到)。如下:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager><asp:LinkButton ID="LinkButton1" runat="server">Click Here to Popup a Modal Dialog
</asp:LinkButton><ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender" runat="server"TargetControlID="LinkButton1"PopupControlID="ModalDialog, ModalDialogPanel"OkControlID="ModalDialog, OkButton"CancelControlID="ModalDialog, CancelButton"OnResolveControlID="ModalPopupExtender_ResolveControlID" /><uc1:ModalDialog ID="ModalDialog" runat="server" />

最后就似乎要响应ResolveControlID事件了,相信大家能够很轻松的得出它的实现方式。如下:

protected void ModalPopupExtender_ResolveControlID(object sender, ResolveControlEventArgs e)
{if (e.ControlID == null) return;string[] controlIds = e.ControlID.Split(',');Control result = this;foreach (string id in controlIds){result = result.FindControl(id.Trim());}e.Control = result;
}

其实ResolveControlID事件的作用和实现就是这么简单。下面就是使用效果:

点击这里下载示例文件。

转载于:https://www.cnblogs.com/JeffreyZhao/archive/2006/12/31/ResolveControlID_Event.html

Tip:使用Extender的ResolveControlID事件相关推荐

  1. vue组件通讯:父传子、子传父、事件发射详解

    1.组件通讯 每个组件有自己的数据, 提供在data中:每个组件数据独立, 组件数据无法互相直接访问 (合理的) 但是如果需要跨组件访问数据,  怎么办呢?  =>   组件通信组件通信的方式有 ...

  2. jQuery事件动画(四)

    目录 一,jQuery事件 常见的DOM事件有 加载DOM的两种方式 1window.onload 2.jquery 绑定事件的两种方式 1.element.on/bind(event,functio ...

  3. JavaScript 浮动定位提示效果

    本来想做一个集合浮动定位和鼠标跟随的tooltips效果,但发现定位和鼠标跟随在一些关键的地方还是不同的,还是分开来吧.  这个效果本身难度不大,主要在程序结构和扩展中下了些功夫,务求用起来更方便,能 ...

  4. 微信小程序图片自动播放功能

    小程序图片自动轮换滚动功能 在看小程序源码时,发现该小程序用内置组件"swiper"实现图片滚动功能.经过测试效果很不错,因此记录下实现方法. 使用小程序组件swiper实现滑块视 ...

  5. 微信小程序学习记录——5.组件

    文章目录 1.视图容器 view scroll-view swiper swiper-item movable-view movable-area movable-view cover-view co ...

  6. 小程序中所有组件学习

    视图容器 view 视图容器 属性名 类型 默认值 说明 最低版本 hover-class String none 指定按下去的样式类.当 hover-class="none" 时 ...

  7. 微信小程序日记、微信小程序个人空间、个人日记

    一.简述 个人比较喜欢微信小程序,因为小程序所追求的用户体验.代码质量.美观的样式,简单方便丰富的api.样式封装等,同时又与普通的前端开发非常相似,让人很容易就上手. 这篇博客介绍的是一款记录个人/ ...

  8. ❤️小程序入门基础(二)❤️(个人学习笔记)

    基本组件使用 cover-image 基础库 1.4.0 开始支持,低版本需做兼容处理. 覆盖在原生组件之上的图片视图. 目前原生组件均已支持同层渲染,建议使用 image 替代.可覆盖的原生组件同c ...

  9. JavaScrpit 犀牛书第七版笔记

    JavaScrpit 犀牛书第七版笔记 挖个坑吧,JavaScript 犀牛书英文的第七版(JavaScript: The Definitive Guide, 7th Edition)其实在去年(20 ...

最新文章

  1. spring 中属性scope 的prototype(有状态)和singleton(无状态)
  2. httpclient 忽略证书_对接外部接口,又一次证书问题!
  3. server 2008 IIS 7下asp.net开发环境部署及配置
  4. 丢失日志文件的风险与对策
  5. excel按季度分类汇总_Excel数据分析实战(1)--电商销售记录分析
  6. alphac测试和bata测试区别_绝缘电阻测试仪和接地电阻测试仪的测试方式区别
  7. JavaEE编码规范
  8. 年报掘金:机构增仓路线图曝光(2010-03-06转载)
  9. 云单元架构,如何赋能数字化转型呢?
  10. No matching configuration of project :libusb was found.
  11. 第三章 磁共振成像原理
  12. word文档的图片怎么保存到动易CMS上
  13. sql 遇到多个重复列名报错:Ambiguous column reference ***
  14. python plot如何保存图片_Matplotlib 保存图片、图画接口和显示中文的使用方法
  15. DAU/MAU?UGC?
  16. LC振荡电路L和C 参数越小 频率越高
  17. 服务器系统运行群晖,使用Synology的NAS系统当DNS服务器
  18. 考PMP必须参加培训吗?自己可以考吗?
  19. 无法在anaconda创建新环境问题
  20. 数据结构与算法之插入排序(含改进版)

热门文章

  1. CodeForces-1058B B. Vasya and Cornfield
  2. [机器学习] 常用并行计算算子原理
  3. atftp 在SUSE Linux中的源代码安装配置方法
  4. nginx cache 配置
  5. 您应该如何改变数据科学教育
  6. 信号分析中一些特征量
  7. 数据库设计笔记——关系型数据库基础知识(三)
  8. HTML一个form表单中有两个(多个)submit,后台如何区分(纯HTML实现,无需javascript)
  9. 嵌入式linux通过DHCP自动获取IP地址实现
  10. win10虚拟内存怎么设置最好_淘宝直通车时间段怎么设置?哪个时间段开最好?...