Asp.Net控件的客户端命名
我们在用ASP.NET写出来的网页,用浏览器来查看生成的客户端代码的时候经常看到这样的代码:GridView1_ctl101_WebUserControl1_webuserControlButton,那么这个命名有什么规律,是怎么来的拉?本次我们使用Reflector查看.net的代码研究其中的规律。
我们的ASP.NET服务器端控件在生成客户端控件的时候一般有id 和name两个属性,这两个属性我们在服务器端可以通过ClientID和UniqueID来得到。
以一个Button为例,用Reflector打开System.Web.dll,找到System.Web.UI.WebControls命名空间下面的Button类,我们可以发现该类继承至WebControl类,其实大多数控件都继承至这个类。这个类是继承了System.Web.UI.Control类的,这个类是我们要研究的重点,该类继承至System.Object类,这是所有类的基类,我们就不去研究了,接下来我们来看看Control类。
找到Control类下面的ClientID属性,查看其代码如下:













也就是说ClientID就是将UniqueID中的IdSeparator (其值为:”$”)替换为”_”。比如我们写一个页面生成出来的代码如下:
<input type="submit" name="GridView1$ctl101$WebUserControl1$webuserControlButton" value="Button" id="GridView1_ctl101_WebUserControl1_webuserControlButton" />
显然name和id的不同就是将其中$替换为了_。
现在ClientID我们已经清楚了,那么UniqueID又是怎么生成的拉?让我们用Reflector来看看。

































这段代码中,最重要的就是GenerateAutomaticID()函数和namingContainer.GetUniqueIDPrefix();函数。我们可以跟进去看看函数是如何实现的。




















从这个函数我们可以看出,对于像GridView这种绑定控件,其生成的每一行中的控件名是由ctl+自增的数字组成的。其中数字的格式化是两位数字,也就是说不足两位的时候补零,多出两位就按实际内容算。


















这个函数返回父控件的UniqueID+IdSeparator,如果父控件UniqueID为空,那么就返回空。
现在我们再回过头来看看GridView1$ctl101$WebUserControl1$webuserControlButton这命名:从中我们可以看到这是一个GridView控件下面绑定了一个WebUserControl控件,而这个控件中有一个webuserControlButton控件。Asp.Net控件的客户端命名
Asp.Net控件的客户端命名的更多相关文章
- asp.net控件开发基础(1)(转)原文更多内容
asp.net本身提供了很多控件,提供给我们这些比较懒惰的人使用,我认为控件的作用就在此,因为我们不想重复工作,所以要创建它,这个本身便是一个需求的关系,所以学习控件开发很有意思. wrox网站上有本 ...
- 服务器端控件的"客户端"
控件的服务端ID和客户端ID 比如一个ID为TextBox1的服务器端控件,在客户端访问该控件的DOM元素时 错误: var txtbox=document.getElementByID(" ...
- ASP.NET控件<ASP:Button /> html控件<input type="button">区别联系
ASP.NET控件<ASP:Button />-------html控件<input type="button">杨中科是这么说的:asp和input是一样 ...
- asp.net <asp:Content>控件
<asp:Content ID="Content2" ContentPlaceHolderID="CPH_MainContent" runat=" ...
- FineUI 基于 ExtJS 的专业 ASP.NET 控件库
FineUI 基于 ExtJS 的专业 ASP.NET 控件库 http://www.fineui.com/
- asp.net控件的Hyperlink控件
Asp.net控件: Hyperlink控件:Hyperlink控件又称为超链接控件,该控件在功能上跟Html的<a herf=””>控件相似,其显示的模式为超链接的形式. 注意: Hyp ...
- C# 控件缩写大全+命名规范+示例
如有转载,请注明出处:http://www.cnblogs.com/flydoos/archive/2011/08/29/2158903.html C# 控件缩写大全+命名规范+示例 写程序的时候突然 ...
- 把某个asp.net 控件 替换成 自定义的控件
功能:可以把某个asp.net 控件 替换成 自定义的控件 pages 的 tagMapping 元素(ASP.NET 设置架构) 定义一个标记类型的集合,这些标记类型在编译时重新映射为其他标记类型. ...
- Asp.Netserver控件开发的Grid实现(三)列编辑器
以下是GridColumnsEditor的实现代码: GridColumnsEditor.cs using System; using System.Collections.Generic; usin ...
随机推荐
- mysql备份及还原
mysql怎样复制数据库?或者说,将数据库拷贝到另外一台机? 按照我的理解,复制数据库,如果是: 1.直接拷贝数据库文件,应该先停数据服务,否则拷不出来.但是,生产机器,哪能说停就停呢? 2.在线拷贝 ...
- struts2 Action获取表单数据
1.通过属性驱动式 1.首先设置 表单中的数据的name值 如:<input type="text" name="username" value=&quo ...
- ubuntu切换中英文通用方法,ubuntu中文语言
1:点击桌面右上角的齿轮,选择“system settings”进入系统设置界面
- Ubuntu 16.04安装JDK/JRE并配置环境变量【转】
本文转载自:http://www.linuxdiyf.com/linux/30302.html 作为一个Linux新手,在写这篇文章之前,安装了几次jdk,好多次都是环境变量配置错误,导致无法登录系统 ...
- aria2 for mac
本文是在安装好homebrew前提下 brew install aria2 然后配置参数 cd ~ mkdir .aria2 cd .aria2 vim aria2.conf 以下配置粘贴进去,红色需 ...
- Python下的LibSVM的使用
突然觉的笔记真的很重要,给自己省去了很多麻烦,之前在Python 3 中装过libsvm 每一步都是自己百度上面搜寻的,花费了很长时间,但是并没有记录方法.这次换了电脑,又开始重新搜寻方法,觉得太浪费 ...
- UI:通讯录实现
通讯录实现草图: 代码: #pragma mark (.h文件)-------------------------------------------------------------------- ...
- Pessimistic Offline Lock悲观离线锁
每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突. 离线并发处理通常会出现多个业务事务操作同一数据. 最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务. 首选乐 ...
- python 模块 module 规范
# /usr/bin/python # -*- coding=utf-8 -*- """This is a standard module""&quo ...
- 题解报告:NYOJ #311完全背包(恰好装满)
描述: 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w.求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大.本题 ...