《asp.net 2.0应用开发技术》 笔记 02
第2章 ASP.NET 2.0服务器控件
1.值得注意的是,HtmlInputButton控件可以执行服务器端的click事件,需要注明是 onserverclick,默认的onclick事件是客户端事件
web服务器控件正好相反,onclick 事件是服务端事件,要执行客户端事件要注明是OnClientClick.
2.在使用HTML服务器控件(Web服务器控件一样),请注意区分ClientID与UniqueID的区别,在母版页、自定义控件和控件嵌套中需要特别注意他们的含义和使用方法。
以下例子描述了这些表好似的含义和规则。
运行上面的程序,查看客户端生成的源代码,可以发现,虽然给按钮指定了ID属性和name属性,但是客户端的ID和name并不是
我们指定的,源代码如下:
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的形式获
得客户端数据的情况,掌握这个属性非常重要。
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的形式获
得客户端数据的情况,掌握这个属性非常重要。