为什么我看不到服务器端控件的生成ID?

时间:2009-04-15 20:26:26

标签: .net asp.net javascript jquery asp.net-3.5

我现在很困惑。让我解释一下:

我看到有人在谈论在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。为什么我会看到不同的行为?

顺便说一下。当我按下按钮时,这确实有效!

感谢。

4 个答案:

答案 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不会被更改。