Могу ли я рассчитывать на то, что ctl00_PagePlaceHolder_myId останется прежним? - PullRequest
4 голосов
/ 16 января 2010

Мне нужно вставить что-то на страницу веб-формы ASP.NET из элемента управления Silverlight.

Я установил идентификатор моего текстового поля и, как и положено, ASP.NET "услужливо" добавляет материал ctl ... blah_blah Могу ли я предположить, что это всегда будет тот же самый gumpf, который он вставляет в начало моего идентификатора?

Доброжелательность,

Dan

РЕДАКТИРОВАТЬ: Спасибо за ответы, ребята.

Используя HtmlPage.Document из моего элемента управления Silverlight, я использовал решение Дуга как таковое ...

var spec = HtmlPage
            .Document
            .GetElementsByTagName("input")
            .FirstOrDefault(so => ((HtmlElement)so).CssClass == "spec");

Ответы [ 3 ]

4 голосов
/ 16 января 2010

Нет. В некоторых случаях он может отображаться по-другому, и изменения в другом месте страницы могут изменить этот элемент управления. Правильный способ справиться с этим - обратиться к свойству .ClientID элемента управления.


Обновление

Вот как я обычно обрабатываю идентификаторы клиентов:

<head runat="server">
   ...
   <script language="javascript">
   var ControlIDs = {
       SomeControl = <%="'" + SomeControl.ClientID%>',
       OtherControl = <%="'" + OtherControl.ClientID%>'
   };
   </script>

   ... other script references here ...
</head>

Я поместил скрипт первым в элемент head, чтобы он был доступен для других файлов скриптов; таким образом мне не нужно передавать файлы javascript через процессор asp.net, и мне нужно только выписать каждый идентификатор клиента один раз. Не нужно беспокоиться о том, чтобы избежать чего-либо, потому что символы 'и \ никогда не будут частью отрисованных идентификаторов клиента. Причина объекта controlID состоит в том, чтобы избежать именования коллизий с другими сценариями, и причина для объединения "" "в начале в коде сервера заключается в том, что asp.net не увидит <% в противном случае.

Опять же: это то, что я обычно делаю, но для некоторых простых страниц это может быть излишним.

4 голосов
/ 16 января 2010

Нет, это может легко измениться, если вы добавите другой элемент управления перед ним или вложите его в другой элемент управления. Кроме того, идентификатор зависит от браузера. В некоторых браузерах .NET разделяется на _, другие браузеры используют $. Я не работал с Silverlight, но вы можете найти элемент с определенным классом? Вы можете применить имя класса к своему элементу, и ASP.NET не будет редактировать его вообще.

0 голосов
/ 16 января 2010

Это может не помочь вам прямо сейчас, но стоит отметить, что .NET 4.0 имеет новое свойство ClientIDMode , которое ослабит головные боли, связанные с этим поведением. В частности, использование настроек Predictable и Static даст легко определяемые идентификаторы. Взгляните на предыдущую ссылку и прокрутите вниз, чтобы увидеть пример того, как будет выглядеть прогнозируемый режим. Я также предлагаю прочитать Идентификатор управления веб-сервером ASP.NET .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...