почему я не вижу сгенерированных идентификаторов для серверных элементов управления?


Теперь я немного запутался. Позвольте мне объяснить:

Я видел, как люди говорили о добавлении кнопки или другого элемента управления на страницу в asp.net (3.5) и когда элемент управления отображает его, изменяется идентификатор этого элемента управления, например. 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) изменение идентификаторов. Почему я вижу по-другому поведение?

Кстати. Это работает, когда я нажимаю на кнопку!

Спасибо.

4 3

4 ответа:

ASP.NET изменяет идентификаторы только тогда, когда элемент управления находится внутри контейнера именования . Это может включать определенные пользовательские элементы управления, ContentPlaceHolders с главной страницы и повторяющиеся элементы управления (Repeater, GridView и т. д.)

Возможно, Вам не всегда нужно использовать YourControl.ClientID, но это хорошая практика, так что если и когда Ваш контроль окажется внутри контейнера, вам не придется возвращаться и исправлять его.

ASP.NET не изменяет имена идентификаторов по умолчанию, но изменяет их, когда они используются в ContentPlaceHolder главной страницы. Таким образом, имена заканчиваются чем-то вроде ctl00_ContentPlaceHolderContent_button1. В вашем случае нет главной страницы и никаких изменений не производится.

Это связано с интерфейсом INamingContainer, который реализуют некоторые элементы управления (такие как asp:content control, используемый с главными страницами).

Из MSDN:

Любой элемент управления, реализующий это интерфейс создает новое пространство имен в какие все атрибуты идентификатора дочернего элемента управления гарантированно уникальны в пределах целое приложение. Маркер предусмотренный этим интерфейсом позволяет уникальное именование объекта динамически созданные экземпляры серверного управления в Веб-сервер контролирует это поддержка привязки данных. Эти меры контроля включите ретранслятор, DataGrid, DataList, CheckBoxList, ChangePassword, LoginView, Меню, SiteMapNodeItem, и radiobuttonlist с контроли.

Ваш пример кода не использует ни один из этих элементов управления. Вы не используете главную страницу с заполнителем ContentPlaceHolder. Ваши идентификаторы не изменяются из-за этого.