在上一篇漫话ID(上)——Name和ID的种种中,我介绍了关于name和id的一些问题,在这片文章中, 我们把目光放到ID上来,这篇主要关注自定义控件和repeater等控件中碰到的UniqueID和ClientID。同时 ,在文末还是依照老习惯,给出一个便于大家理解的例子,而不仅仅是纸上谈兵。
在ASP.NET 的服务器端控件中有三种关于ID 的属性,即 ID, ClientID 和 UniqueID。ID 表示控件的 服务器端编程的标识符,我们写服务器端的代码,就要用到这个 ID, 通过这个 ID 可以在服务器端对服 务器端控件的属性、方法和时间进行编程访问。ClientID 表示由服务器端生成的客户端控件的ID, 经 常用于在客户端脚本中访问服务器控件所呈现的 HTML 元素。一般情况下与服务器端的 ID 相同,有时, 不能为控件生成唯一的名称,例如,如果 Repeater 空间在它的某个模板中包含一个 Label 控件,则将 在客户端生成多个该 Lable 的 HTML 元素, 为防止命名冲突,ASP.NET 为各个服务器控件生成一个唯一 的 ClientID ,ClientID 通过将子控件的父控件的 UniqueID 值与控件的 ID 值连接生成,各个部分之间 以下划线 _ 连接。UniqueID 用于获取服务器控件的唯一的、以分层方式表示的标识符。当将控件放置到 重复控件(Repeater、DataList和DataGrid)中时,将可能生成多个服务器端的控件,这就需要区分服务 器端的各个控件,以使它们的 ID 属性不冲突。UniqueID 通过将子控件的父控件的 UniqueID 值与控件 的 ID 值连接生成,各个部分之间以 IdSeparator 属性指定的字符连接。默认情况下, IdSeparator 属 性为冒号字符 (:)。
例如,创建以下 ASP.NET 服务器控件:
<asp:textbox id="TextBox1" runat="server" text="Sample Text" />
ClientID 属性被设置为 TextBox1,在基于 HTML 的浏览器中,其结果元素与以下所示类似:
<input name="TextBox1" type="text" value="Sample Text" id="Text1" />
可以使用这些属性在客户端脚本中引用服务器控件。通常,必须在客户端脚本中用完全限定引用来引 用控件;如果控件是页面中 form 元素的子控件,则一般使用document.forms[0].TextBox1.value = "New value"在客户端脚本中引用控件。有些控件将子控件呈现在页面中。这些控件中包括数据列表控件 (如 GridView、DetailsView、FormView、DataList 和 Repeater 控件)、用户控件和 Web 部件控件。
例1:
在页面中加入一个DataGrid控件,然后在该控件中加入Button子控件。
前台代码:
<asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="false">
后台代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2);
DataGrid1.DataSource = list;
DataGrid1.DataBind();
}
}