您现在的位置是:首页 > .NET

.NET

.Net自定义控件之INamingContainer接口详解

2020-11-19 09:44:57 .NET admin
INamingContainer是一个没有任何方法和属性的接口,了解这一接口,我们首先要清楚.net中服务器控件的唯一标志:控件ID。作为控件使用者来说,使用的最多的应该就是控件的ID了,其实任何一个服务器控件都有三个标识,分别是Clien
INamingContainer是一个没有任何方法和属性的接口,了解这一接口,我们首先要清楚.net中服务器控件的唯一标志:控件ID。

作为控件使用者来说,使用的最多的应该就是控件的ID了,其实任何一个服务器控件都有三个标识,分别是ClientID、ID与UniqueID。

三个标识解释如下:
ClientID:客户端ID,就是我们在页面前台利用js取控件值时所用到的控件标识。
ID:我们在使用控件时为它赋于的一个标识,即我们给它命名的ID,而这个ID无论是在客户端还是在服务器端都不会使用,它只是方便我们编程而已。
UniqueID:服务端控件的标识,.net在服务器端搜索控件时,就是使用UniqueID。

在明白了上面三个ID后,我们还需要知道,在一个页面中,是不允许出现相同的ID。无论是ClientID,还是ID与UniqueID。

那么,.net是如何来保证一个页面中所有的控件都不会产生相同的ID呢?比如,在一个复合控件中,我们为一个子控件设置了ID为button1。然后我们在页面中拖放了这个复合控件,那么.net在生成html页时,就会生成一个ID为button1的控件,如果我们在这个页面中再拖放一个这个复合控件,按照理解,那么在生成html页时,会再生成一个ID为button1的控件,这样,ClientID就重复了,而在asp.net,这是不允许的。

那么,.net中是如何来处理这个问题呢?这时INamingContainer接口就上场了。

INamingContainer是一个没有任何方法和属性的接口,当自定义控件实现这个接口时,asp.net页框架将在这个控件下创建一个命名范围,为这个控件的所有子控件的ID加上"父控件+分隔符"这样的前缀,这就可以使的在同一个页面中,所有的控件ID都不重复了。

我们可以用一个例子来验证这个问题:
先创建一个名为ServerControl1的复合控件,代码如下:
namespaceINamingContainerControl
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl1runat=server></{0}:ServerControl1>")]
publicclassServerControl1:WebControl
{
protectedoverridevoidCreateChildControls()
{
TextBoxtextbox=newTextBox();
textbox.ID="textbox1";
this.Controls.Add(textbox);
}
}
}