2009-04-15 92 views
3

我现在有点困惑。让我解释一下:为什么我没有看到为服务器端控件生成的ID?

我见过有人在讨论在asp.net(3.5)的页面中添加一个按钮或其他控件,并且控件呈现它时会更改该控件的ID,例如。 Button1的成为Button1_somethingsomething以防止它们使用jQuery,他们最终采用什么是<%controlId.ClientId %>

所以我做了一个小测试

1. I added a button on the page: 
<form id="form1" runat="server"> 
<div> 
<asp:Button ID="Button1" runat="server" Text="Button" /> 
<div> 

2. Then I added a JavaScript and jQuery: 
<script type="text/javascript"> 
        $(document).ready(function() { 
        $("#Button1").click(function() { 
         alert("Hello world!"); 
        }); 

        }); 
       </script> 

3. The generated html is this: 
<div> 
    <input type="submit" name="Button1" value="Button" id="Button1" /> 
<div> 

现在这样的东西,我没有看到ASP.NET(ASP。净3.5)改变ID。为什么我看到不同的行为?

Btw。这在我点击按钮时起作用!

谢谢。

回答

9

ASP.NET仅在控件位于Naming Container的内部时更改ID。这可能包括某些用户控件,来自母版页的ContentPlaceHolders以及重复控件(Repeater,GridView等)

0

默认情况下,ASP.NET不会更改ID名称,但当它们在主页面的ContentPlaceHolder。所以这些名字最终会变成ctl00_ContentPlaceHolderContent_Button1。在你的情况下,没有母版页,也没有改变。

0

这是由于INamingContainer接口某些控件(例如用于主页面的asp:内容控件)实现的。

MSDN

实现这个 接口的任何控件创建在 一个新的命名空间,所有的子控件ID属性 保证是一个 整个应用程序中是唯一的。由该接口提供的标记 允许 在 支持数据绑定的Web服务器控件内的动态生成的服务器控件实例 的唯一命名。这些控件 包括Repeater,DataGrid, DataList,CheckBoxList, ChangePassword,LoginView,Menu, SiteMapNodeItem和RadioButtonList 控件。

你的示例代码不使用这些控件。您不使用ContentPlaceHolder的主页面。您的ID不会因此而改变。

1

您可能不总是需要使用YourControl.ClientID,但它是很好的做法,这样,如果当你的控件并结束了一个容器内,都不用回去收拾它。

相关问题