|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
完全不一样的。.net其实我也说不太清,.net可以把他理解为跟J2EE相对的工具。c++主要做系统相关的开发你要学.net的话就应该学C#。(其实微软在.NET平台上也考虑了给C++留一个地位。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);
}
}
}
能够看到,这个复合控件并没有承继INamingContainer接口,然后我们在一个aspx页面中放两个ServerControl1控件,再看这个aspx页面熟成的html代码以下:
<formname="form1"method="post"action="Default.aspx"id="form1">
<div>
<inputtype="hidden"name="__VIEWSTATE"id="__VIEWSTATE"value="/wEPDwUJMjYwNjA1NjY2ZGRfWPmkcbCTQZzDM9Iy18YcRqkh4w=="/>
</div>
<div>
<inputtype="hidden"name="__EVENTVALIDATION"id="__EVENTVALIDATION"value="/wEWAwL56q+LAQKsyrLrBgKsyrLrBpkl+pkIRqjolfXhcUP62HYpKeUo"/>
</div>
<spanid="ServerControl11"><inputname="textbox1"type="text"id="textbox1"/></span>
<spanid="ServerControl12"><inputname="textbox1"type="text"id="textbox1"/></span>
</form>
能够看到,页面中天生了两个id即是textbox1的控件。这是不同意的,由于假如存在两个id不异的控件时,我们在利用js的documnet.getElementById()办法取控件值时,便可能会取不准确的值。
上面我们修正ServerControl1控件,使之承继INamingContainer接口,代码以下:
namespaceINamingContainerControl
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl1runat=server></{0}:ServerControl1>")]
publicclassServerControl1:WebControl,INamingContainer
{
protectedoverridevoidCreateChildControls()
{
TextBoxtextbox=newTextBox();
textbox.ID="textbox1";
this.Controls.Add(textbox);
}
}
}
能够看到,这段代码与上段代码比拟,只是承继了INamingContainer接口,别的没有做任何改动。然后我们一样在一个aspx页面中放进两个ServerControl1控件,再看这个页面熟成的Html代码以下:
<formname="form1"method="post"action="Default.aspx"id="form1">
<div>
<inputtype="hidden"name="__VIEWSTATE"id="__VIEWSTATE"value="/wEPDwUJMjYwNjA1NjY2ZGRfWPmkcbCTQZzDM9Iy18YcRqkh4w=="/>
</div>
<div>
<inputtype="hidden"name="__EVENTVALIDATION"id="__EVENTVALIDATION"value="/wEWAwL56q+LAQL5/Pb7DQKUjsuiDnCm+0IPVDI3HZWQs46aZEI5tpWD"/>
</div>
<spanid="ServerControl11"><inputname="ServerControl11$textbox1"type="text"id="ServerControl11_textbox1"/></span>
<spanid="ServerControl12"><inputname="ServerControl12$textbox1"type="text"id="ServerControl12_textbox1"/></span>
</form>
能够看到,aspx页面中ServerControl1控件中的TextBox控件ID前都主动加上了前缀"ServerControl11_",name前也主动加上了"ServerControl11$"的前缀,另外一个ServerControl2控件中的TextBox控件ID分离加上了"ServerControl12_"与"ServerControl12$"的前缀,如许就包管了在统一个aspx页面中,每一个控件都具有分歧的id与name。
总结:InamingContainer接口的感化就是为懂得决一个页面中在利用多个自界说控件时ID大概会反复的成绩。如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。 |
|