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

Я немного запутался здесь и сейчас. Позвольте мне объяснить:

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

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

Спасибо.

Ответы [ 4 ]

9 голосов
/ 16 апреля 2009

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

1 голос
/ 16 апреля 2009

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

0 голосов
/ 16 апреля 2009

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

С MSDN :

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

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

0 голосов
/ 16 апреля 2009

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

...