ASP.NET 4.0的ID,ClientID,UniqueID及ClientIDMode属性篇

QQ:1187362408 欢迎技术交流和学习

ASP.NET 4.0的ID,ClientID,UniqueID及ClientIDMode属性篇(ID,ClientID,UniqueID及ClientIDMode属性):

TODO:

1,ID:ID是([1]

ID是设计的时候自己所指定的ID,是我们分配给服务器控件的编程标识符,我们常常使用this.controlid来寻找控件,那么这个controlid就是这里所说的ID

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<script type="text/javascript">
function GetValue()
{
<SPAN style="COLOR: #0080c0"><STRONG>document.write('<%= TextBox1.ClientID %>')</STRONG></SPAN>
}
</script>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<input type="button" runat="server" id="button1" onclick="GetValue();" value="赋值" />
</asp:Content>
页面显示了<SPAN style="COLOR: #0080c0"><STRONG>ctl00_ContentPlaceHolder1_TextBox1</STRONG></SPAN>。即TextBox1.ClientID =ctl00_ContentPlaceHolder1_TextBox1。 

2,UniqueID:([2]

UniqueID 服务器控件的唯一的、分层的形式限定的标识符。 是当需要参与服务端回传的时候用的。当将控件放置到重复控件(Repeater、DataList和DataGrid)中时,将可能生成多个服务器端的控件,这就需要区分服务器端的各个控件,以使它们的 ID 属性不冲突。UniqueID 通过将子控件的父控件的 UniqueID 值与控件的 ID 值连接生成,各个部分之间以 IdSeparator 属性指定的字符连接。默认情况下,
IdSeparator 属性为冒号字符 (:)。此属性为在 .Net Framework2.0种新增加。 (UniqueID 的解释做了参照,本篇重点强调ID与ClientID

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<script type="text/javascript">
function GetValue()
{
<SPAN style="COLOR: #0080c0"><STRONG><SPAN style="TEXT-DECORATION: line-through">var t=document.getElementById("TextBox1");</SPAN></STRONG></SPAN>
t.innerText=2;
}
</script>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<input type="button" runat="server" id="button1" onclick="GetValue();" value="赋值" />
</asp:Content>
出错了,t=null,也就是找不到TextBox1,所以需要改成<SPAN style="COLOR: #0080c0"><STRONG>var t=document.getElementById('<%=TextBox1.ClientID%>');</STRONG></SPAN> 

3,ClientID:([3]

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

4,ClientIDMode:([4]

在ASP.NET 4.0中的每个控件上都多了一个叫做ClientIDMode的属性,这就是解决上面获取控件ID难的解决方案。这个属性有四个可选值,根据所选值的不同它可以控制页面上生成控件的ID格式。

下面就让我们来了解下ClientIDMode属性的四个值:

1,AutoID:[5]

当控件的ClientIDMode选中为AutoID时,该控件的ClientID 值是通过串联每个祖先容器控件(诸如GridView、ListView、LoginView等就是容器性控件)的ID和父容器控件的ID和其本身的ID 值生成的,当然如果该控件没有在任何容器控件中其ClientID 值就是其本身的ID值,不会做任何更改。 另外如果该控件所在的父容器控件或祖先容器控件有些是显示多个数据行的容器控件(例如GridView、ListView就是显示多数据行的容器控件),那么还将在这些容器控件的ID值的后面会插入一个递增的行号格式。
各部分之间以下划线字符 (_) 分隔。 可见在 ASP.NET 4 之前的版本中使用的就是AutoID方案来生成控件的ClientID 值。

比如下面这个GridView里面就有一个名叫Label1的ID,我们将Label1的ClientIDMode设置为了AutoID:

<span style="color:#000000;">Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><asp:GridView ID="grd_Account" runat="server" AllowPaging="True"
    AutoGenerateColumns="False"
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px"
    Width="676px" PageSize="5" ClientIDMode="AutoID" >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server"
                    Text='<%# Bind("[Account Number]") %>' ClientIDMode="AutoID"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
HTML:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
        <th scope="col">Account Number</th>
    </tr>
        <tr>
    <td>
            <span id="grd_Account_ctl02_Label1">1060</span>
        </td>
    </tr>
        <tr>
    <td>
            <span id="grd_Account_ctl03_Label1">1200</span>
        </td>
    </tr>
        <tr>
    <td>
            <span id="grd_Account_ctl04_Label1">1510</span>
        </td>
    </tr>
</table></span>

2,Static:[6]

当控件的ClientIDMode选中为Static时,该控件的ClientID 值就是其本身设置的 ID 属性值,其ClientID值不会受到父容器控件的影响。

比如我们把上面的代码稍作修改,将Label1的ClientIDMode属性改为Static:

<span style="color:#000000;"><asp:GridView ID="grd_Account" runat="server" AllowPaging="True"
    AutoGenerateColumns="False"
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px"
    Width="676px" PageSize="5"  >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("[Account Number]") %>' ClientIDMode="Static"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
HTML:
<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
        <th scope="col">Account Number</th>
    </tr><tr>
        <td>
            <span id="Label1">1060</span>
        </td>
    </tr><tr>
        <td>
            <span id="Label1">1200</span>
        </td>
    </tr><tr>
        <td>
            <span id="Label1">1510</span>
        </td>
    </tr>
</table></span>

3,Inherit:[7]

这个属性其实没什么好说的,如果控件的ClientIDMode选中为Inherit,那么表示该控件的ClientIDMode会使用父级容器控件的ClientIDMode值,如果父级容器控件的ClientIDMode也为Inherit,那么会使用更上层容器控件的ClientIDMode值,直到回溯到页面的ClientIDMode值为止,页面的ClientIDMode值默认为Predictable ,你可以在页面上的<%@ Page%>指令中对该值做更改。此外Inherit也是ASP.NET
4.0中所有控件的ClientIDMode属性的默认值。

4,Predictable:[8]

首先我先说明下之所以最后写Predictable,是因为我发现控件的ClientIDMode为Predictable时生成ClientID的机制会非常复杂,要分好几个部分分别进行讨论,其中还有特殊情况,所以我在这里只能说尽量将我发现的Predictable生成ClientID的机制阐述清楚。

当控件的ClientIDMode选中为Predictable时,该控件的ClientID 值是通过串联父容器控件(诸如GridView、ListView、LoginView等就是容器性控件)的 ClientID 值生成的。另外如果该控件是在显示多个数据行的父容器控件或祖先容器控件中(例如GridView、ListView就是显示多数据行的容器控件),则还会在该控件ClientID 值的末尾添加 ClientIDRowSuffix 属性中指定的数据字段的值。 对于 GridView 控件,ClientIDRowSuffix
属性可以指定多个数据字段。 如果 ClientIDRowSuffix 属性为空白,则在末尾添加递增的行号,而非数据字段值。 各部分之间以下划线字符 (_) 分隔。

以上是MSDN的说法,但是经过试验,我发现Predictable的特性更应该是用这么个式子来表达:

Inherit[+"_"+ClientIDRowSuffix]

意思就是说,如果一个控件的ClientIDMode选中为Predictable,那么在ASP.NET生成该控件的ClientID时首先会去看该控件所属的父容器控件的ClientIDMode是什么值,然后先用该控件父容器控件的ClientIDMode规则生成该控件本身的ClientID,最后如果该控件所属的父容器控件或祖先容器控件是显示多个数据行的容器控件,还会根据父容器控件或祖先容器控件的ClientIDRowSuffix属性的值在该控件已生成的ClientID后面加上一个后缀字符串。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 03:06:14

ASP.NET 4.0的ID,ClientID,UniqueID及ClientIDMode属性篇的相关文章

ID,ClientID,UniqueID的区别

ID是设计的时候所指定的ID. ClientID是当这个控件生成到客户端页面时候,需要在客户端访问时候用的. UniqueID是当需要参与服务端回传的时候用的. 备注:当控件是子控件的时候(例如在用户控件中的Button),ClientID在HTML页面中是作为控件的ID属性,UniqueID是作为控件的Name属性,如果不是子控件,那么ClientID和UniqueID是相同的 例如: MyControl1是一个用户控件,里面包含一个ID为Button1的按钮,把MyControl1放在一个页

ASP.NET 4.0的ClientIDMode属性

时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的ClientID头疼,比如明明一个叫lblName的Label放在一个叫做grd的GridView里面后,在页面上改Label的ID就变成了诸如grd_clt02_lblName的一长串字符串,如果我们在前台想在使用JS的时候找到该Label,我们不得不用到C#脚本来获得该Label在前台的确切ID,诸

ASP.NET 4.0配置文件中的ClientIDMode属性

ASP.NET 4.0配置文件中的ClientIDMode属性来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p=99时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的ClientID头疼,比如明明一个叫lblName的Label放在一个叫做grd的GridView里面后,在页面上改Label的ID就变成

Asp.Net MVC2.0 Url 路由入门---实例篇

本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的View的呢?Controller和Action是怎么解析的?这就是Routing组件干的事情了. Routing的作用:它首先是获取到View传过来的请求,并解析Url请求中Controller和Action以及数据,其次他将识别出来的数据传递给Controller的Action(Controller

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

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

ASP.NET 2.0 异步页面原理浅析 [1]

与 ASP.NET 1.0 相比,ASP.NET 2.0 的各方面改进可以说是非常巨大的.但就其实现层面来说,最大的增强莫过于提供了对异步页面的支持.通过此机制,编写良好的页面可以将数据库.WebService 调用等慢速操作,对网站吞吐能力的影响降到最低,并极大的改善网站的平均页面响应速度.本文将从使用和实现两个层面,简单的剖析这一强大机制的原理,以便读者能够更好的应用这一机制.      对一个网页请求的生命周期来说,首先是 Web 服务器收到客户端 HTTP 请求,将请求转交给 ASP.N

ASP.NET 4.0 来了

伴随着VS2010的公开测试,ASP.NET4.0也进入了我们的视线.ASP.NET4.0究竟给我们带来了什么,将在哪些方面提高我们的生产力? 在何时你需要使用ASP.NET4.0开发你的网站程序? 需要更严格的遵守Web标准: 需要更流畅的Web Form开发方式: 需要更好的搜索引擎优化: 需要后知后觉的纠正一些不够优良的设计,这些设计甚至可能是在ASP.NET 1.0发布之前就存在的: 需要将现有的功能重新改造为支持server farm或跨application domains: 需要将

数独解算器(ASP.NET 2.0)

数独游戏 在9x9的方格内进行, 分为3x3的小方格,被称为"区". 数独游戏首先从已经填入数字的格子开始. 数独游戏的目的是根据下列规则,用1至9之间的数字填满空格: 每个数字在每一行.每一列和每一区只能出现一次. 我在 Linux 服务器(请参见"在 Linux 下运行 ASP.NET 2.0")上用 ASP.NET 2.0 实现了一个数独解算器. http://www.sudoku.name 网站上也有一个用户界面相当不错的"数独解算器"

Log4Net异常日志记录在asp.net mvc3.0的应用

前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual Studio2010(Asp.Net Mvc3.0)中使用log4net快速创建系统日志,如何扩展以输出自定义字段. 用户可以从http://logging.apache.org/log4net/下载log4net的源代码.解压软件包后,在解压的src目录下将log4net.sln载入Visual