3

我现在有点困惑。让我解释:

我见过人们谈论在 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

4 回答 4

9

ASP.NET 仅在控件位于命名容器内时更改 ID 。这可能包括某些用户控件、母版页中的 ContentPlaceHolders 和重复控件(Repeater、GridView 等)

于 2009-04-15T20:29:57.247 回答
1

您可能并不总是需要使用 YourControl.ClientID,但这是一种很好的做法,这样当您的控件最终进入容器时,您就不必返回并修复它。

于 2009-04-15T20:45:02.483 回答
0

默认情况下,ASP.NET 不会更改 ID 名称,但在母版页的 ContentPlaceHolder 中使用它们时会更改它们。所以名称最终会变成类似于 ctl00_ContentPlaceHolderContent_Button1 的名称。在您的情况下,没有母版页,也没有进行任何更改。

于 2009-04-15T20:31:11.767 回答
0

这是由于某些控件(例如用于母版页的 asp:content 控件)实现的 INamingContainer 接口。

来自MSDN

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

您的示例代码不使用任何这些控件。您不要将母版页与 ContentPlaceHolder 一起使用。您的 ID 不会因此而改变。

于 2009-04-15T20:41:48.653 回答