在Web世界,ID这个属性真是无所不在。对于这个我们最常用最熟悉的ID属性,我们又真的了解多少呢?本章,小编就带你一起探索ID的详解。
在阅读本章前,请记住:
1,在Asp.Net页面中,任何一个服务器控件都必须且只能有一个ID属性。
2,在同一个页面中,任何一个ID都是唯一的,决对不会有重复的ID值。
下面我们开始详细了解ID属性:
我们使用的任何一个服务器控件的基类中,都定义了控件的标识--属性ID,定义如下:
public virtual string ID
{
get;
set;
}
对于服务器控件来说,同一个页面中ID必须是唯一的,因为这个ID被用来唯一标识与定位这个服务器控件,如果我们没有给ID赋值的话,.Net会自动给我们赋一个。
在实际项目中,我们会发现服务器控件还有一个ClientID的属性,这个是.Net自动生成的Html客户端ID,这个ClientID是服务器自动计算并赋值的,我们不能认为ClientID与ID相同,而且ClientID总是同一个值。在使用它时,我们应该用ClientID这个属性来获值。
ClientID定义如下:
public virtual string ClientID
{
get;
}
可以看出,这个是一个只读属性。
在实际项目中,我们经常会用到从父控件中的Controls集合中查找子控件,除了可以通过Controls集合的下标来查找外,我们也可以通过控件的ID来查找,控件的FindControl方法提供了这个功能:
public virtual Control FindControl(string id)
如果找到,返回子控件的引用,如时未找加,返回Null.
可能存在的问题:仔细想想,因为ID必须是唯一的,如果我在一个数据控件的模板列中放置了一个服务器控件,那么我在后台只给这个控件赋了一个ID属性值,但数据控件在运行时可能会生成N多个该控件,那么,这些控件的ID怎么来保持唯一性呢?
这是因为,我们的数据控件都实现了INamingContainer接口,这个接口没有任何成员,它只是一个标识接口,它告诉服务器,所有继承了我的控件,都要为控件的子控件的ID前添加一个唯一的前缀,使所有子控件ID都不重复。
INamingContainer接口的定义如下:
public interface INamingContainer
当实现了这个接口这后,默认情况下,控件的子控件的ID都会由一个特殊分隔符分开的三部分组成:
父控件ID 分隔符 序列号 分隔符 我们定义的子控件ID
其中分隔符默认为"$",分隔符我们可以通过属性IdSeparator来获得,它的定义如下:
Protected char IdSeparator
{
get;
}
注意:这个分隔符是可以由我们自己重新定义的。
与这个属性相关的还有一个属性是ClientIDSeparator,用来定义生成客户端的ID的分隔符,它的定义如下:
Protected char ClientIDSeparator
{
get;
}
它的默认值是"_",这样我们就清楚了为什么我们页面的源代码中会有很多包含"_"的ID。
以上是小编对服务器控件ID的一些了解,希望对大家有所帮助。uz廭Km諎錧wQ0僛齹Y魐聣0Wubh堄~済烺齹詋W