1.值得注意的是,HtmlInputButton控件可以执行服务器端的click事件,需要注明是 onserverclick,默认的onclick事件是客户端事件
web服务器控件 正好相反,onclick 事件是服务端事件,要执行客户端事件要注明是OnClientClick.
2.在使用HTML服务器控件(Web服务器控件一样),请注意区分 ClientID与UniqueID的区别,在母版页、自定义控件和控件嵌套中需要特别注意他们的含义和使用方法。
以下例子描述了这些表好似的含义和规则。
<%
@ Import Namespace="System.Data"
%>
<% @ Page language="c#" Codebehind="WebForm3.aspx.cs" AutoEventWireup="false" Inherits="Incentive2008.WebForm3" %>
< HTML >
< HEAD >
< title > WebForm3 </ title >
< script runat ="server" >
void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
DataTable dt=new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("ButtonValue",typeof(string)));
for(int i=0;i<3;i++)
{
dr=dt.NewRow();
dr[0]="按钮"+i.ToString();
dt.Rows.Add(dr);
}
Repeater1.DataSource=new DataView(dt);
Repeater1.DataBind();
}
}
void Submit1_Click(Object sender,EventArgs e)
{
Message.Text="<li>HtmlInputControl 的 Name 属性值:"+((HtmlInputControl)sender).Name;
Message.Text="<li>HtmlInputControl 的 ID 属性值:"+((HtmlInputControl)sender).ID;
Message.Text="<li>HtmlInputControl 的 UniqueID 属性值:"+((HtmlInputControl)sender).UniqueID;
Message.Text="<li>HtmlInputControl 的 ClientID 属性值:"+((HtmlInputControl)sender).ClientID;
Message.Text="<li>HtmlInputControl 的 NamingContainer 属性值:"+((HtmlInputControl)sender).NamingContainer.UniqueID;
Message.Text="<li>HtmlInputControl 的 NamingContainer的ParentID 属性值:"+((HtmlInputControl)sender).NamingContainer.Parent.ID;
}
</ script >
</ HEAD >
< body MS_POSITIONING ="GridLayout" >
< form id ="Form1" method ="post" runat ="server" >
< asp:Repeater id ="Repeater1" runat ="server" >
< ItemTemplate >
< input id ="Submit1" type =submit name ="AddButton" value ='<%# Eval("ButtonValue")% > ' onserverclick="Submit1_Click" runat=server>
</ ItemTemplate >
</ asp:Repeater >
< br >
< br >
< asp:Label ID ="Message" Runat ="server" />
</ form >
</ body >
</ HTML >
<% @ Page language="c#" Codebehind="WebForm3.aspx.cs" AutoEventWireup="false" Inherits="Incentive2008.WebForm3" %>
< HTML >
< HEAD >
< title > WebForm3 </ title >
< script runat ="server" >
void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
DataTable dt=new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("ButtonValue",typeof(string)));
for(int i=0;i<3;i++)
{
dr=dt.NewRow();
dr[0]="按钮"+i.ToString();
dt.Rows.Add(dr);
}
Repeater1.DataSource=new DataView(dt);
Repeater1.DataBind();
}
}
void Submit1_Click(Object sender,EventArgs e)
{
Message.Text="<li>HtmlInputControl 的 Name 属性值:"+((HtmlInputControl)sender).Name;
Message.Text="<li>HtmlInputControl 的 ID 属性值:"+((HtmlInputControl)sender).ID;
Message.Text="<li>HtmlInputControl 的 UniqueID 属性值:"+((HtmlInputControl)sender).UniqueID;
Message.Text="<li>HtmlInputControl 的 ClientID 属性值:"+((HtmlInputControl)sender).ClientID;
Message.Text="<li>HtmlInputControl 的 NamingContainer 属性值:"+((HtmlInputControl)sender).NamingContainer.UniqueID;
Message.Text="<li>HtmlInputControl 的 NamingContainer的ParentID 属性值:"+((HtmlInputControl)sender).NamingContainer.Parent.ID;
}
</ script >
</ HEAD >
< body MS_POSITIONING ="GridLayout" >
< form id ="Form1" method ="post" runat ="server" >
< asp:Repeater id ="Repeater1" runat ="server" >
< ItemTemplate >
< input id ="Submit1" type =submit name ="AddButton" value ='<%# Eval("ButtonValue")% > ' onserverclick="Submit1_Click" runat=server>
</ ItemTemplate >
</ asp:Repeater >
< br >
< br >
< asp:Label ID ="Message" Runat ="server" />
</ form >
</ body >
</ HTML >
运行上面的程序,查看客户端生成的源代码,可以发现,虽然给按钮指定了ID属性和name属性,但是客户端的ID和name并不是
我们指定的,源代码如下:
<
input
name
="Repeater1$ctl0$Submit1"
id
="Repeater1__ctl0_Submit1"
type
="submit"
value
="按钮0"
/>
< input name ="Repeater1$ctl1$Submit1" id ="Repeater1__ctl1_Submit1" type ="submit" value ="按钮1" />
< input name ="Repeater1$ctl2$Submit1" id ="Repeater1__ctl2_Submit1" type ="submit" value ="按钮2" />
< input name ="Repeater1$ctl1$Submit1" id ="Repeater1__ctl1_Submit1" type ="submit" value ="按钮1" />
< input name ="Repeater1$ctl2$Submit1" id ="Repeater1__ctl2_Submit1" type ="submit" value ="按钮2" />
HtmlInputControl 的 Name 属性值:Repearter1$ctl002$Submit1;
HtmlInputControl 的 ID 属性值:Submit1;
HtmlInputControl 的 UniqueID 属性值:Repearter1$ctl002$Submit1;
HtmlInputControl 的 ClientID 属性值:Repearter1_ctl002_Submit1;
HtmlInputControl 的 NamingContainer的UniqueID 属性值:Repearter1$ctl002;
HtmlInputControl 的 NamingContainer的ParentID 属性值Repearter1:
因此,在编写客户端的程序时,不要用指定的ID值在客户端引用对象,一定要用该对象的ClientID属性传递到客户端的引用。
从上面的例子还可以看到,Name属性和UniqueID属性的命名规则是以“$”分割开来,而ClientID属性是以“_”分割开来,
Repeater1和ctl001等这个都是什么意思呢?如果在页面指令中把Trace=true,就可以看到ASP.NET在解析页面时的控件树
图,命名规则是以命名容器(NamingContainer)控件的ID和该控件ID的值链接而成(注意:不一定是父控件的ID)。服务器
控件的UniqueID会呈现客户端的name属性中,ClientID会呈现到客户点的id属性中。对于需要通过 Request.Form的形式获
得客户端数据的情况,掌握这个属性非常重要。