我现在很困惑。让我解释一下:
我看到有人在谈论在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.net 3.5)更改了ID。为什么我会看到不同的行为?
顺便说一下。当我按下按钮时,这确实有效!
感谢。
答案 0 :(得分:9)
ASP.NET仅在控件位于Naming Container内时更改ID。这可能包括某些用户控件,母版页中的ContentPlaceHolders以及重复控件(Repeater,GridView等)
答案 1 :(得分:1)
您可能并不总是需要使用YourControl.ClientID,但这是一个很好的做法,以便当您的控件最终进入容器内时,您不必返回并修复它。
答案 2 :(得分:0)
ASP.NET默认情况下不会更改ID名称,但在母版页的ContentPlaceHolder中使用它们时会更改它们。所以名称最终会像ctl00_ContentPlaceHolderContent_Button1。在您的情况下,没有母版页,也没有进行任何更改。
答案 3 :(得分:0)
由于INamingContainer接口,某些控件(例如asp:content控件,与母版页一起使用)实现。
来自MSDN:
任何实现此目的的控件 interface在中创建一个新的命名空间 其中所有子控件的ID属性 保证在一个内部是独一无二的 整个申请。标记 由此接口提供允许 动态的唯一命名 生成服务器控件实例 在Web服务器中控制它 支持数据绑定。这些控件 包括Repeater,DataGrid, DataList,CheckBoxList, ChangePassword,LoginView,菜单, SiteMapNodeItem和RadioButtonList 控件。
您的示例代码不使用任何这些控件。您不使用具有ContentPlaceHolder的母版页。因此,您的ID不会被更改。