Tip:使用Extender的ResolveControlID事件

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事件的作用和实现就是这么简单。下面就是使用效果:

1%5B4%5D.jpg

 

点击这里下载示例文件。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我常用的shell命令

我常用的shell命令tar:tar jxvf filename.tar.bz2tar xvf filename.tartar cvf filename.tar file tar cjvf filename.tar.bz2 file wc:ls -l | wc -ltr:ls -l | tr a-z A-Zgrep:ls -l | grep ^dls -l | grep -n ^dls -l | grep -v ^decho "theaaaathebbbbthe | grep \<…

Git常用命令整理

git init # 初始化本地git仓库&#xff08;创建新仓库&#xff09;git config --global user.name "xxx" # 配置用户名git config --global user.email "xxxxxx.com" # 配置邮件git config --global color.ui true # git status等命令自动着色git config -…

LeetCode—<分治专项>剑指 Offer 07、16、33

剑指 Offer 07. 重建二叉树、16. 数值的整数次方、33. 二叉搜索树的后序遍历序列 题目描述&#xff1a; [07] 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 [16] 实现 pow(x,…

唱歌的方法与技巧[收集]

Method 1我想很多人都有些嗓子限制,就认为自己不适合唱歌等...其实绝大多数人,都是可以唱的非常棒的,就算嗓子很不好,也可以通过自我的锻炼逐渐培养出来的.其实唱歌到达一定阶段,可以说,逐渐的少用嗓子.有些人唱歌时,用手压着嗓子,不让嗓子向上,其实是有原因的.但这并不是正确的…

练习(00008)

参考&#xff1a;第7章 JavaScript.doc/第7章 JavaScript.文件夹转载于:https://www.cnblogs.com/lesvies/archive/2011/09/19/2181495.html

《算法导论》——MergeSort

前言&#xff1a; 在今后的日子里&#xff0c;我将持续更新博客&#xff0c;讨论《算法导论》一书中的提到的各算法的C实现。初来乍到&#xff0c;请多指教。 今日主题&#xff1a;   今天讨论《算法导论》第二章算法基础中的归并排序算法。下面是该算法的代码Merge.h&#x…

MySQL 常用运算符

1.算数运算符 加 mysql> select 12; 减 mysql> select 2-1; 乘 mysql> select 2*3; 除 mysql> select 5/3; 商 mysql> SELECT 5 DIV 2; 模 mysql> select 5%2,mod(5,2); 2.比较运算符 等于 mysql> select 10,11,nullnull; 不等于 mysql> select 1<&…

react 路由v6

这里是区别&#xff1a;V5 vs V6 这里是官网&#xff1a;可以查看更多高级属性 基本使用&#xff1a; 1、配置文件 src/routes/index import React from "react";const Home React.lazy(() > import("../Pages/Home")); const About React.lazy(()…

LeetCode—<位运算专项>剑指 Offer 15、56 - I、56 - II、65

剑指 Offer 15. 二进制中1的个数、56 - I. 数组中数字出现的次数、56 - II. 数组中数字出现的次数 II、65. 不用加减乘除做加法 题目描述&#xff1a; [15] 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表…

Asp.net2.0 学习资源(转载)

asp.net 2.0 http://beta.asp.net/QUICKSTART/aspnet/http://msdn.microsoft.com/vstudio/express/vwd/learning/default.aspxasp.net 1.0 名称&#xff1a;快速入门地址&#xff1a;http://chs.gotdotnet.com/quickstart/描述&#xff1a;本站点是微软.NET技术的快速入门网站&…

java学习笔记十一——对象转型

向上转型&#xff1a;子类对象当做父类对象来使用&#xff0c;因为子类对象拥有父类对象的所有成员&#xff0c;所以不会发生任何错误。向下转型&#xff1a;父类对象当做子类对象来使用&#xff0c;因为子类对象部分特性父类并没有&#xff0c;所以需要加强制转换符。向上转型…

LeetCode—<数学专项>剑指 Offer 14 - I、39、57 - II、62、66

剑指 Offer 14- I. 剪绳子、39. 数组中出现次数超过一半的数字、57 - II. 和为s的连续正数序列、62. 圆圈中最后剩下的数字、66. 构建乘积数组 题目描述&#xff1a; [14 - I] 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#…

Win8下在Vmware11中安装使用苹果系统OS X 10.10

原文:Win8下在Vmware11中安装使用苹果系统OS X 10.10近来因为需要做 iOS 的项目&#xff0c;所以需要多花一些时间看看敲敲代码。因为自己手头上并没有 Mac&#xff08;过年为了闲的时候能玩玩游戏买了联想&#xff0c;唉&#xff09;&#xff0c;想想不能只靠每天在公司的时间…

图片滑动效果(转)

var $ function(id) {return "string" typeof id ? document.getElementById(id) : id; };function Event(e) {var oEvent document.all ? window.event : e;if (document.all) {if (oEvent.type "mouseout") {oEvent.relatedTarget oEvent.toEleme…

《Windows Communication Foundation之旅》系列之二

《Windows Communication Foundation之旅》系列之二 三、WCF的技术要素作为基于SOA&#xff08;Service Oriented Architecture&#xff09;的一个框架产品&#xff0c;WCF最重要的就是能够快捷的创建一个服务&#xff08;Service&#xff09;。如下图所示&#xff0c;一个WCF…

JS---捕捉URL地址,以及模仿GET方法

主页博客相册个人档案好友查看文章JS 模拟的GET方法代码: function _GET(){var url window.top.location.href;var start url.indexOf(?)1;var end url.length;var Query_String url.substring(start, end);var Get Query_String.split(&);for (var i in Get){;var t…

centos 记录用户行为轨迹

遇到问题&#xff1a;公司增加了运维管理员&#xff0c;为确保服务器安全&#xff0c;和发生问题的时候好确认问题&#xff0c;需要记录每位服务器登陆者的行为轨迹。解决问题&#xff1a;linux script 命令正有如此强大的功能。满足我们需求。script记录终端会话。操作步骤&am…

引子

回看博客&#xff0c;最后一篇转载都是2012年6月份了。将近三年的中断&#xff0c;是虚度的明证。 回顾这段时间&#xff1a;结婚&#xff0c;老婆怀孕&#xff0c;离开北京&#xff0c;儿子出生。。普通人的幸福生活的一部分&#xff0c;几乎是我这段时间的全部了。 这段时间的…

LeetCode—<数学专项>剑指 Offer 20、29、31、67

剑指 Offer 20. 表示数值的字符串、29. 顺时针打印矩阵、31. 栈的压入、弹出序列、67. 把字符串转换成整数 题目描述&#xff1a; [20] 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几…

Android内核剖析

--Android内核剖析 柯元旦 编著ISBN 978-7-121-14398-4 2011年9月出版定价&#xff1a;79.90元16开616页内容简介&#xff1a;本书内容分别从基础、内核、系统、编译以及硬件驱动几个方面对Android内核相关知识进行深入剖析&#xff0c;详细分析了Android内核的内部机制&#…