Asp.Net控件的客户端命名

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属性,查看其代码如下:

public virtual string ClientID
{
    
get
    
{
        
this.EnsureID();
        
string uniqueID = this.UniqueID;
        
if ((uniqueID != null) && (uniqueID.IndexOf(this.IdSeparator) >= 0))
        
{
            
return uniqueID.Replace(this.IdSeparator, '_');
        }

        
return uniqueID;
    }

}


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

public virtual string UniqueID
{
    
get
    
{
        
if (this._cachedUniqueID == null)
        
{
            Control namingContainer 
= this.NamingContainer;//获得父控件
            if (namingContainer == null)
            
{
                
return this._id;
            }

            
if (this._id == null)
            
{
                
this.GenerateAutomaticID();//对控件自动编号
            }

            
if (this.Page == namingContainer)//当前控件的父控件是Page则UniqueID就是控件的ID。
            {
                
this._cachedUniqueID = this._id;
            }

            
else//当前控件父控件是另一种容器控件
            {
                
string uniqueIDPrefix = namingContainer.GetUniqueIDPrefix();//取得父控件UniqueID+分隔符($)作为当前控件的UniqueID前缀。
                if (uniqueIDPrefix.Length == 0)
                
{
                    
return this._id;
                }

                
this._cachedUniqueID = uniqueIDPrefix + this._id;//前缀+ID 作为当前控件的UniqueID
            }

        }

        
return this._cachedUniqueID;
    }

}

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

private void GenerateAutomaticID()
{
    
this.flags.Set(0x200000);
    
this._namingContainer.EnsureOccasionalFields();
    
int index = this._namingContainer._occasionalFields.NamedControlsID++;
    
if (this.EnableLegacyRendering)
    
{
        
this._id = "_ctl" + index.ToString(NumberFormatInfo.InvariantInfo);
    }

    
else if (index < 0x80)
    
{
        
this._id = automaticIDs[index];
    }

    
else
    
{
        
this._id = "ctl" + index.ToString(NumberFormatInfo.InvariantInfo);
    }

    
this._namingContainer.DirtyNameTable();
}

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

internal virtual string GetUniqueIDPrefix()
{
    
this.EnsureOccasionalFields();
    
if (this._occasionalFields.UniqueIDPrefix == null)
    
{
        
string uniqueID = this.UniqueID;
        
if (!string.IsNullOrEmpty(uniqueID))
        
{
            
this._occasionalFields.UniqueIDPrefix = uniqueID + this.IdSeparator;
        }

        
else
        
{
            
this._occasionalFields.UniqueIDPrefix = string.Empty;
        }

    }

    
return this._occasionalFields.UniqueIDPrefix;
}

这个函数返回父控件的UniqueID+IdSeparator,如果父控件UniqueID为空,那么就返回空。
现在我们再回过头来看看GridView1$ctl101$WebUserControl1$webuserControlButton这命名:从中我们可以看到这是一个GridView控件下面绑定了一个WebUserControl控件,而这个控件中有一个webuserControlButton控件。

别再只会用QTcpSocket了!手把手教你用QSslSocket为你的Qt网络应用加上SSL/TLS加密(附完整代码示例) 本文详细介绍了如何将Qt网络应用从QTcpSocket迁移到QSslSocket,实现SSL/TLS加密传输。通过对比API差异、解析核心机制和提供完整代码示例,帮助开发者快速掌握安全网络编程技巧,有效防范数据窃听和中间人攻击等安全风险。 阅读详情

相关推荐

【工具使用】Keil常用的调试操作整理介绍

2、当选择了非0级优化时,调试可能会变得困难,具体表现在断点调试。该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的置。:如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句。但我的Keil软件中无法显示这个视图,并且通过修改系统试图,调试时,点击打开系统视图发生了闪退的现象,目前能想到的原因是:重新安装Keil,安装最新版本。

MEYOU_Cc 不吃香菜! 1万+

ASP.NET 客户端控件、服务器端控件

按钮隐藏一个控件就不要写服务端代码,在客户端用JavaScript、Dom来操作就可以。比如要操作数据库,显然是在浏览器端做不到的,这时候就要写服务端代码。能在浏览器端完成的事情,就不要到服务端去做。

Kaizen的博客 520

DDR4协议规范之(一)DDR4结构和寻址

DDR4 SDRAM结构和寻址DDR4 SDRAM的封装和寻址新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 DDR4 SDRAM的封装和寻址 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习

YJFeiii的博客 3万+

asp.net 控件的 ID ,ClientID ,UniqueID 区别

对于每一个服务器控件System.Web.UI.Control 都具有 ID,UniqueID,ClientID 三个属性,那么这个三者到底有河关系,在客户端HTML中又是如何对应呈现的呢? ID:获取或设置分配给服务器控件的编程标识符。 分配给控件的编程标识符。 (可写) 设置服务器控件上的此属性可提供对服务器控件的属性、事件和方法的编程访问。Web 开发人员可以通过在 ASP

技术资料收集站 745

Xilinx IP核 Block Memory Generator v8.4 的使用

本文主要介绍如何使用并初始化 Xilinx 提供的IP核 Block Memory Generator v8.4`,为了确保成功初始化,还对其进行了一个简单的仿真,更多细节请参考官方手册。

高阶近似的博客 1万+

OpenCV教程:超详细的OpenCV入门教程,值得收藏

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法(最基本的滤波到高级的物体检测皆有涵盖)。 OpenCV 使用 C/C++ 开发,同时也提供了 Python、Java、MATLAB 等其他语言的接口。 OpenCV 是跨平台的,可以在Windows、Linux、Mac OS、Android、iOS 等操作系统上运行。 OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、..

pythonandaiot的博客 14万+

Python 爬虫实战:抓取新闻网站上的新闻标题和内容

随着信息化的进展,新闻网站已经成为人们获取新闻和时事资讯的主要途径。许多新闻网站提供了丰富的内容,涵盖了社会、政治、科技、娱乐等多个领域。通过抓取新闻网站的内容,我们可以分析新闻的趋势,获取某一领域的最新动态,甚至为数据分析和机器学习提供数据支持。本文将详细介绍如何使用 Python 编写爬虫,抓取新闻网站上的新闻标题和内容。requests:发送 HTTP 请求,获取页面内容。:解析 HTML 页面并提取数据。Selenium:抓取动态加载的网页内容。新闻API。

2201_76125261的博客 3407

ASP.NET控件的ID,ClientID,UniqueId的区别

一般情况下三者相同(没有父控件) ID:获取或设置分配给服务器控件的编程标识符。分配给控件的编程标识符。 (可写) 设置服务器控件上的此属性可提供对服务器控件的属性、事件和方法的编程访问。Web 开发人员可以通过在 ASP.NET 服务器控件的开始标记中声明 ID 属性来设置此属性。如果没有为服务器控件指定该属性(以声明方式或编程方式),则可通过其父控件的 Controls 属性获取对该控件的...

weixin_30898109的博客 158

黑猫带你学UFS协议第23篇:UFS固件升级操作详解(FFU)

摘要:本文介绍了UFS固件更新(FFU)的实现方法与注意事项。根据UFS3.1 JEDEC协议,FFU通过write buffer命令(MODE=0Eh)下载FW固件,随后必须进行power cycle或硬件复位生效。文章详细阐述了FFU操作的10条规则,包括数据分片传输要求、寄存器访问限制等,同时指出协议未明确的厂商实现差异。关键寄存器包括bFFUTimeout、bDeviceFFUStatus和fPermanentlyDisableFwUpdate。

黑猫奥利奥的博客 1万+

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

前程算法屋的博客 851

asp.net 控件的 ID ,ClientID ,UniqueID 区别

对于每一个服务器控件System.Web.UI.Control 都具有 ID,UniqueID,ClientID 三个属性,那么这个三者到底有河关系,在客户端HTML中又是如何对应呈现的呢?ID:获取或设置分配给服务器控件的编程标识符。分配给控件的编程标识符。 (可写)设置服务器控件上的此属性可提供对服务器控件的属性、事件和方法的编程访问。Web 开发人员可以通过在 ASP.NET 服务器控件

2638

AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南

官网:www.SZLCSC.COM以芯片为例器件类——>芯片类——>对应芯片确定芯片——>数据手册1:原理图2:PCB3:打开操作流程选中原理图——>文件——>导出——>AD1: ✔2:导出AD文件操作流程选中PCB图——>文件——>导出——>AD1: ✔2:导出AD文件1:PCB图2:原理图操作流程文件——>打开操作流程选中文件——>打开操作流程项目文件——>添加新的...到工程——>Schematic Library新原理图库操作流程项目文件——>添加新的...到工程——>PCB Library新的PC

XU157303764的博客 5436

Atlas 1.0版的命名和产品发布计划

【原文地址】"Atlas" 1.0 Naming and Roadmap 【原文发表日期】Monday, September 11, 2006 10:01 AM 在过去的一年内,我们一直在奋力开发Atlas。Atlas一直在发展,变化和成长,是因为我们得到了惊人数量的反馈和早期采纳。我们看到了围绕着这个产品的难以置信的兴趣和兴奋,光是今年,下载数目就超过25万次。 发布Atlas 1.0版 ...

爱.NET 96

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Atlas命名空间Sys.Data下控件介绍——DataSource和XMLDataSource

English Version: http://dflying.dflying.net/1/archive/123_introduction_to_atlas_controls_in_namespace_sysdata__datasource_and_xmldatasource.html   本系列有如下三篇文章: Atlas命名空间Sys.Data下控件介绍——DataSour...

weixin_34163741的博客 249

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ASP.NET控件属性:ID、ClientID 和 UniqueID 的区别

ID 表示控件的服务器端编程的标识符,我们写服务器端的代码,就要用到这个 ID, 通过这个 ID 可以在服务器端对服务器端控件的属性、方法等进行编程访问。 ClientID 表示由服务器端生成的客户端控件的ID, 经常用于在客户端脚本中访问服务器控件所呈现的 HTML 元素。一般情况下与服务器端的 ID 相同,有时,不能为控件生成唯一的名称,例如,如果 Repeater ...

weixin_30682127的博客 69

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

.NET中获取服务器端控件的ID进行客户端编程

.NET中获取服务器端控件的ID进行客户端编程 2009-12-10 9:42 在ASP.NET 的服务器端控件中有三种关于 ID 的属性,即 ID, ClientID 和 UniqueID。 ID 表示控件的服务器端编程的标识符,我们写"服务器端的代码",就要用到这个 ID, 通过这个 ID 可以在服务器端对服务器端控件的属性、方法和时间进行编程访问。(可写) Cli...

weixin_30641465的博客 103

在JS中获取控件的值

学习笔记:.net/  2007-10-02HtmlControl   :   document.getElementById("controlID").value;   WebControl     :   document.getElementById("").value;其中clientID是获取由 ASP.NET 生成的服务器控件标识符。 有时,不能为控件分配唯一的名称。例如,如果

何翔华的专栏 1万+
上一篇: 用VS2005调试JS
下一篇: 用C#实现pdf文件的完整性验证
studyzy
博客等级 码龄22年 566粉丝 232原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值