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

简介:

 说明:该文章是我转载的,我对文章中的部分内容进行了修改,原文见底部链接。

 

对于每一个服务器控件System.Web.UI.Control 都具有 ID,UniqueID,ClientID 三个属性,那么这个三者到底有何关系,在客户端HTML中又是如何对应呈现的呢?


ID:获取或设置分配给服务器控件的编程标识符。
分配给控件的编程标识符。 (可写)

设置服务器控件上的此属性可提供对服务器控件的属性、事件和方法的编程访问。Web 开发人员可以通过在 ASP.NET 服务器控件的开始标记中声明 ID 属性来设置此属性。

如果没有为服务器控件指定该属性(以声明方式或编程方式),则可通过其父控件的 Controls 属性获取对该控件的引用。(见下)

注意 
在此属性中包含空格将导致 ASP.NET 页分析器错误。

 

UniqueID获取服务器控件的唯一的、以分层形式限定的标识符。(只读)
服务器控件的完全限定标识符。

此属性与 ID 属性不同,因为 UniqueID 属性包含服务器控件命名容器的标识符。处理页请求时自动生成此标识符。

此属性对于区分包含在其他重复的数据绑定服务器控件中的服务器控件尤其重要。重复控件包括 RepeaterDataList 和 DataGridWeb 服务器控件(或任何在数据绑定时创建的包含重复功能的自定义服务器控件),它们充当其子控件的命名容器。这意味着它为其子控件创建唯一的命名空间,以使它们的 ID 属性值不冲突。

例如,如果将 ASP.NETLabelWeb 服务器控件包含在 Repeater 服务器控件中,并给 Label 控件赋以 MyLabel 的 ID 属性值,给Repeater 赋以 MyRepeater 的 ID 属性值。如果将 Repeater 数据绑定到具有三个项的 ArrayList 对象,则 Label 服务器控件的每个实例所产生的 UniqueID 属性是 MyRepeater:ctl0:MyLabel、MyRepeater:Ctl1:MyLabel 和 MyRepeater:Ctl2:MyLabel。(摘自MSDN:Control.UniqueID属性

 

ClientID:获取由 ASP.NET 生成的服务器控件标识符。 (只读)
由 ASP.NET 生成的服务器控件标识符。

有时,不能为控件分配唯一的名称。例如,如果 Repeater 控件在它的某个模板中包含一个 Label 控件,则为 Repeater 控件中的各个项呈现该 Label 控件的一个实例。在呈现控件的多个实例时,为防止出现命名冲突,ASP.NET 为页上的各个服务器控件自动生成一个唯一的 ClientID 值。ClientID 值是通过连接控件的 ID 值和它的父控件的 UniqueID 值生成的。如果未指定控件的 ID 值,则使用自动生成的值。生成的 ID 的各个部分以下划线字符 (_) 分隔。

Note注意

除了用来分隔 ID 值的是下划线字符而不是 IdSeparator 属性指定的字符以外,为控件生成的 ClientID 值与 UniqueID 值相同。默认情况下,IdSeparator 属性设置为冒号字符 (:)。由于 ClientID 值不包含冒号字符,因此,它可以用于不支持包含冒号的 ID 的 ECMAScript。

 

ClientID 值经常用于以编程方式访问为客户端脚本中的控件呈现的 HTML 元素。有关详细信息,请参见 ASP.NET 网页中的客户端脚本

(摘自MSDN:Control.ClientID属性)


总结:
ID,
这个肯定很熟悉了,用于server端编程引用控件,没有对应的client值,即不呈现到html中

UniqueID,
asp.net引擎按控件树层次生成的分层形式限定的标志符,连接符默认为 $ (美元符号),此连接符在asp.net 2.0 中由属性 IdSeparator 指定,在client中呈现为html元素的name属性
此属性主要用来提交(PostBack)客户端数据,如Request.Form[someControl.UnqiueID]

附:

     IdSeparator属性

属性值

分隔符字符。默认为“$”。
    IdSeparator 属性中包含的字符用于分隔子控件的控件标识符。ID 分隔符字符将追加到  ID 属性。
    (摘自MSDN: Control.IdSeparator属性

ClientID,
由父控件的UnqiueID连接本身ID而成,但是连接符不一样,默认为 _ (下划线),此连接符在asp.net 2.0 中由属性  ClientIDSeparator  指定, 在client中呈现为html元素的id属性,
此属性主要在客户端教本中使用,如 var o = document.getElementById('<% = someControl.ClientID %>');
附:
     ClientIDSeparator属性
      类型:System.Char
      始终返回下划线字符 (_)。

     ClientID 值是通过连接控件的 ID 值和它的父控件的 UniqueID 值生成的。 生成的 ID 属性的各个部分以 
     ClientIDSeparator 属性值分隔。 该值始终返回一个下划线 (_)。
 

关于 UniqueID的层次分隔符号,1.x 中为 :(冒号),而 2.0 已实现为 $(美元符),主要原因可能是 javascript 中标识符是允许 $,而不允许 : 的。(当你偷懒的时候,可以在 js 中直接使用表单元素的 name属性应用该表单元素,而不用 document.getElementsByName 或者 document.getElementById,不推荐:) 
ASP.NET 使用的回发机制(简单版本)是通过一个原型为 __doPostBack(<ControlUniqueID>, <CommandArgs>) 的 javascript 函数

function __doPostBack(eventTarget, eventArgument) {
 
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
 theForm.__EVENTTARGET.value 
= eventTarget;
 theForm.__EVENTARGUMENT.value 
= eventArgument;
 theForm.submit();
 }

}


此函数的第一个参数 <ControlUniqueID> 对应引起页面回发控件的客户端 name 属性/服务端 UniqueID 属性,
当用户引发一个事件,如点击按钮,选择列表框的某一项,首先通过 _doPostBack 函数将此值存在隐藏域中,然后提交页面。

在服务器端,ASP.NET 引擎通过 HttpRequest.HttpMethod 确定请求是否为 post 方式,若是,则检索HttpRequest.Request.Form["__EVENTTARGET'], 获取引发回发的控件唯一标识符,并在页面控件集合层次中查找,若找到此控件,则将在适当阶段引发服务器端事件。

 

另补充控件变化规律如下:

控件名字发生变化是因为 INamingContainer这个接口。这个接口没有任何方法,仅只作为一个标记。ASP.NET维护控件name和id生成的规律是:
NamingContainer爷爷$NamingContainer爸爸$该控件的ID
id则一般将$换为"_"

你把控件直接放到form下,它头顶唯一一个NamingContainer是Page,但是这个是特殊的逻辑,不会生成__Page_控件名,所以就只剩控件名了,于是ID看起来没有变化。

当你把控件放到Repeater中时,Repeater自己被INamingContainer标记,同时,每一次循环,它会把模板内的控件重新生成一遍,同时生成一个RepeaterItem, 把这些根据模板生成的控件加入RepeaterItem的子控件。这个RepeaterItem也是一个NamingContainer. 于是控件中就会带有:

RepeaterID(Data)_RepeaterItemID(ctl + 号码)_控件ID. ---->如:Repeater1_ctl00_Button1

不过非runat=server控件因为不由ASP.NET维护, 不会发生变化. UserControl.ascx由于其基类也是一个NamingContainer, 所以如果你把控件放入.ascx, 然后在页面上引用, 则前面又会多一层UserControl的ID.

 

 

通过controls集合访问服务器控件:

在VS2005中新建一个.aspx文件,打开HTML页会发现一个原先的声明从 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 
变成了 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">! 
很早以前就称的HTML的接班人XHTML,现在MS终于要将它扶正了.. 
这样在写HTML代码时就要注意了, 
如: 
<font> 
<div> 
</font> 
</div> 
是无法在Vs2005中的Design模式中正确显示的[很明显的错误,但在HTML可以正常显示].. ,XHTML的语法比HTML严格的

多 
而关于XHTML和HTML的区别,如果不是非常明白 
http://www.blueidea.com/tech/site/2004/1911.asp 
这个文章可以参考一下

 

Form

Form新添加了几个功能比较有用的是 
defaultbutton、defaultfocus关从字面的意思大家就可以理解了以前在ASP.NET中让人头痛的默认提交表单按钮和设

置焦点在ASP.NET 2.0已经提供了,不用象以前那样自己写javascript来控制了 
关于焦点在也可以代码中通过 txtUserName.Focus();来设置了,看得出来ASP.NET2.0是设计是多么的细致。

 

Header 
在代码中可能通过 
this.Header.Metadata.Add("taye", "value"); 
this.Header.Title = "value"; 
this.Header.LinkedStyleSheets.Add("style.css"); 
来控制Title,Meta,Style等[好象LinkedStyleSheets只能是text/css???] 
this.Header.StyleSheet.RegisterStyle() 
方法将一个style内嵌到网页中去.

这样页面几乎所以部分都可以得到控制了 
有些人也许会想那<html>和<body>呢 

我们先来运行一下面这个代码.

private void Page_Load(object sender, EventArgs e) 
       { 
            foreach (Control ctl in Page.Controls) 
              { 
                  Response.Write(ctl.ToString() + "<BR/>");

                  LiteralControl lc = ctl as LiteralControl;

                  if (lc != null) 
                   { 
                       Response.Write(lc.Text); 
                   } 
              }

       }


你将会看到一个正常页的有如下五个控件 
System.Web.UI.LiteralControl 
System.Web.UI.HtmlControls.HtmlHead 
System.Web.UI.LiteralControl 
System.Web.UI.HtmlControls.HtmlForm 
System.Web.UI.LiteralControl

 

 

而三个LiteralControl的控件的内容分别为

System.Web.UI.LiteralControl 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

System.Web.UI.LiteralControl 
    <body> 

System.Web.UI.LiteralControl 
</body> 
</html>

 

所以如果你要对body或<!DOCTYPE..>或<html>进行控制那你就找到这相应的控件以后再进行相应的修改吧

只要对 
LiteralControl.Text进行修改就可以.

 

原文章链接:http://www.cnblogs.com/jhxk/articles/1661393.html

 本文转自 酷小孩 博客园博客,原文链接: http://www.cnblogs.com/babycool/archive/2012/06/02/2531461.html ,如需转载请自行联系原作者


相关文章
|
3月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
34 0
|
4月前
|
SQL 开发框架 JavaScript
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
32 0
|
5月前
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
42 0
|
5月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
68 0
|
5月前
|
开发框架 .NET 数据安全/隐私保护
Asp.Net第二章服务器端控件
Asp.Net第二章服务器端控件
28 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
46 0
|
15天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
21 0
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
109 5
|
9月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
124 0