Для чего control id

Обновлено: 05.07.2024

Клавиша Ctrl есть на всех клавиатурах, предназначенных для любых операционных систем, кроме MAC Os( там данная клавиша заменена на cmd и выполняет схожий функционал, как Ctrl). Часто задаются вопросом, для чего же предназначена данная клавиша? Чтобы полностью ответить на данный вопрос предстоит обратиться к истории.

Изначально на клавиатуре данная клавиша была предназначена для ввода управляющих символов. Непонятно, да? А непонятно из-за того, что сейчас управляющие символы не используются, да и раньше в них не было потребности. Управляющие символы, это те символы, которые лишены графического изображения, но предназначены для управления устройствами и базами данных. Отсюда и следует, что Ctrl = Control.

В наше время данная клавиша предназначена для расширения функционала клавиатуры, так как существует достаточно большое количество комбинаций клавиш в связке с Ctrl.

Сочетания клавиш можно применять в различных программах и утилитах, так как в большинстве случаев данные комбинации признаны общепринятыми.

Чаще всего используется сочетание "Ctrl" + "C" и "Ctrl" + "V", для копирования и вставки содержимого быстрым способом. Так же комбинацией "Ctrl" + "F" можно вызвать поиск содержимого в папке, документе, файле или на странице в браузере.

Если Вы работаете в каком-нибудь редакторе, то наверняка привыкли использовать комбинацию "Ctrl" + "Z", которая отменяет последнее Ваше действие. Так же в работе с редакторами используется комбинация "Ctrl" + "S", которая сохраняет документ или другую Вашу работу.

Код Windows CodeIntegrity Operational log ID

Код события Объяснение
3076 Файл аудита, исполняемый/dll
3077 Файл block executable/dll
3089 Подписание информационного события коррелирует с событием 3076 или 3077. Для каждой подписи файла создается одно событие 3089. Содержит общее количество подписей в файле и индекс, какой подписью он является. Unsigned files will generate a single 3089 event with TotalSignatureCount 0. Коррелирует в "Системе" часть данных событий в статье "Корреляция activityID".
3099 Указывает, что политика загружена

Введение

Как вы могли иметь предполагаете, главные страницы и элементов управления ContentPlaceHolder реализуются как контейнеры именования. В этом учебнике мы рассмотрим, как главные страницы влияют на HTML-элемент id значения и каким образом программно ссылаться на Web Controls в пределах страницы содержимого с помощью FindControl .

Добавление страницы содержимого Идиссуес. aspx в корневую папку

Рис. 01. Добавление страницы содержимого IDIssues.aspx в корневую папку

Visual Studio автоматически создает элемент управления содержимым для каждой из четырех элементов управления ContentPlaceHolder на главной странице. Как отмечалось в руководстве по использованию нескольких элементов управления ContentPlaceHolder и содержимого по умолчанию , если элемент управления содержимым отсутствует, вместо него создается содержимое ContentPlaceHolder по умолчанию для главной страницы. Так как QuickLoginUI и LeftColumnContent элементов управления ContentPlaceHolder содержат подходящую разметку по умолчанию для этой страницы, удалите соответствующие элементы управления содержимым из IDIssues.aspx . На этом этапе декларативная разметка страницы содержимого должна выглядеть следующим образом:

В разделе Указание заголовка, Meta-тегов и других заголовков HTML в учебнике по главной странице мы создали пользовательский класс базовой страницы ( BasePage ), который автоматически настраивает заголовок страницы, если он не задан явно. Для использования этой функции IDIssues.aspx ной страницей класс кода программной части страницы должен быть производным от класса BasePage (вместо System.Web.UI.Page ). Измените определение класса кода программной части так, чтобы оно выглядело следующим образом:

Наконец, обновите файл Web.sitemap , включив в него запись для этого нового занятия. Добавьте элемент <siteMapNode> и задайте для его title и url атрибутов значение "проблемы именования идентификатора управления" и

/IDIssues.aspx соответственно. После внесения этого добавления разметка файла Web.sitemap должна выглядеть следующим образом:

Как показано на рис. 2, Новая запись схемы узла в Web.sitemap сразу же отражается в разделе «уроки» в левом столбце.

В разделе "уроки" теперь имеется ссылка на "проблемы именования ИДЕНТИФИКАТОРов элементов управления"

Рис. 02. Теперь в разделе "уроки" содержится ссылка на "проблемы ИМЕНОВАНия идентификаторов управления".

Сводка

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

Поздравляем с программированием!

Дополнительные материалы

Дополнительные сведения о разделах, обсуждаемых в этом руководстве, см. в следующих ресурсах:

Понимание событий Application Control

Политика Защитник Windows управления приложениями (WDAC) регистрит события локально в Windows в режиме принудительного или аудита. Эти события создаются в двух расположениях:

Коды событий, начиная с 30, отображаются в журналах приложений и служб **** > Microsoft > Windows > CodeIntegrity > Operational

ИД событий, начиная с 80, отображаются в журналах приложений и служб **** > Microsoft > Windows > AppLocker > MSI и Script

Эти ID событий не применяются в Windows Server Core edition.

Шаг 3. Программная ссылка на веб-элементы управления через FindControl

FindControl удобно использовать в сценариях, где требуется доступ к элементу управления, но у вас нет прямой ссылки на него. Например, при работе с веб-элементами управления данными, такими как GridView, элементы управления в полях GridView определяются один раз в декларативном синтаксисе, но во время выполнения экземпляр элемента управления создается для каждой строки GridView. Следовательно, элементы управления, созданные во время выполнения, существуют, но у нас нет прямой ссылки, доступной из класса кода программной части. В результате необходимо использовать FindControl для программной работы с конкретным элементом управления в полях GridView. (Дополнительные сведения об использовании FindControl для доступа к элементам управления в шаблонах веб-элемента управления данными см. в разделе настраиваемое форматирование на основе данных.) Такой же сценарий возникает при динамическом добавлении веб-элементов управления в веб-форму, которая обсуждается в разделе Создание пользовательских интерфейсов платформа динамических данных записи.

Конечно, не нужно использовать FindControl для ссылки на элементы управления Label и TextBox в этом примере. Мы могли бы ссылаться на них напрямую через их ID значения свойств. Я использую FindControl здесь, чтобы продемонстрировать, что происходит при использовании FindControl на странице содержимого.

создается NullReferenceException

Если задать точку останова в обработчике событий SubmitButton_Click , то вы увидите, что оба вызова FindControl возвращают null значение. NullReferenceException возникает при попытке доступа к свойству Text текстового поля Age .

Проблема заключается в том, что Control.FindControl выполняет поиск только тех потомков элемента управления, которые находятся в одном контейнере именования. Поскольку Главная страница создает новый контейнер именования, вызов Page.FindControl("controlID") никогда не пермеатес объект главной страницы ctl00 . (См. рис. 4 для просмотра иерархии элементов управления, которая показывает объект Page как родительский для объекта главной страницы ctl00 .) Поэтому текстовое поле Results метка и Age не найдены, а ResultsLabel и AgeTextBox присваиваются значения null .

Существует два обходных решения этой проблемы: можно детализировать по одному контейнеру именования для соответствующего элемента управления. или можно создать собственный метод FindControl , пермеатес контейнеры именования. Давайте рассмотрим каждый из этих вариантов.

Детализация соответствующего контейнера именования

Чтобы использовать FindControl для ссылки на Results метку или в текстовое поле Age , необходимо вызвать FindControl из элемента управления предка в том же контейнере именования. Как показано на рис. 4, элемент управления MainContent ContentPlaceHolder является единственным предком Results или Age , находящихся в одном и том же контейнере именования. Иными словами, вызов метода FindControl из элемента управления MainContent , как показано в приведенном ниже фрагменте кода, правильно возвращает ссылку на элементы управления Results или Age .

Однако мы не можем работать с MainContent ContentPlaceHolder из класса кода программной части страницы содержимого, используя приведенный выше синтаксис, так как ContentPlaceHolder определен на главной странице. Вместо этого для получения ссылки на MainContent необходимо использовать FindControl . Замените код в обработчике событий SubmitButton_Click следующими изменениями:

Прежде чем можно будет использовать FindControl для получения ссылки на MainContent , сначала требуется ссылка на элемент управления главной страницы. После получения ссылки на главную страницу можно получить ссылку на MainContent ContentPlaceHolder через FindControl и, в нем, ссылаться на текстовое поле Results Label и Age (опять же, с помощью FindControl ). Но как получить ссылку на главную страницу? Изучив атрибуты id в отображаемой разметке, очевидно, что ID значение главной страницы ctl00 . Поэтому можно использовать Page.FindControl("ctl00") для получения ссылки на главную страницу, а затем использовать этот объект для получения ссылки на MainContent и т. д. Эта логика показана в следующем фрагменте кода:

Хотя этот код наверняка будет работать, предполагается, что автоматически сформированные ID главной страницы всегда будут ctl00 . Не рекомендуется делать предположения об автоматически сформированных значениях.

К счастью, ссылка на главную страницу доступна через свойство Master класса Page . Таким образом, вместо того чтобы использовать FindControl("ctl00") для получения ссылки на главную страницу для доступа к MainContent ContentPlaceHolder, мы можем использовать Page.Master.FindControl("MainContent") . Обновите обработчик событий SubmitButton_Click следующим кодом:

возраст пользователя отображается в метке

Рис. 06. возраст пользователя отображается в метке (щелкните, чтобы просмотреть изображение с полным размером).

Рекурсивный поиск по контейнерам именования

Причина, по которой предыдущий пример кода ссылался на MainContent элемент управления ContentPlaceHolder с главной страницы, а затем Results метка и Age элементы управления TextBox из MainContent , является потому, что метод Control.FindControl выполняет поиск только в контейнере именования элемента управления. Наличие FindControl в контейнере именования имеет смысл в большинстве сценариев, поскольку два элемента управления в двух разных контейнерах именования могут иметь одинаковые значения ID . Рассмотрим регистр GridView, определяющий веб-элемент управления Label с именем ProductName в одном из его полей TemplateField. Когда данные привязываются к GridView во время выполнения, для каждой строки GridView создается ProductName метка. Если FindControl выполнить поиск по всем контейнерам именования и назвать Page.FindControl("ProductName") , то какой экземпляр метки должен возвращаться FindControl ? ProductName метку в первой строке GridView? Он находится в последней строке?

Хорошая новость состоит в том, что мы можем создать собственный метод FindControl , который рекурсивно ищет все контейнеры именования. На самом деле, использование методов расширения можно присвоить методу FindControlRecursive к классу Control , чтобы сопровождать его существующим методом FindControl .

Чтобы создать метод расширения, добавьте новый файл в папку App_Code с именем PageExtensionMethods.cs . Добавьте метод расширения с именем FindControlRecursive , который принимает в качестве входных данных параметр string с именем controlID . Чтобы методы расширения работали правильно, крайне важно, чтобы сам класс и его методы расширения были помечены как static . Более того, все методы расширения должны принимать в качестве первого параметра объект типа, к которому применяется метод расширения, и этому входному параметру должно предшествовать ключевое слово this .

Добавьте следующий код в PageExtensionMethods.cs файл класса, чтобы определить этот класс и метод расширения FindControlRecursive :

После этого кода вернитесь к классу кода программной части IDIssues.aspx страницы и закомментируйте текущий метод FindControl . Замените их вызовами Page.FindControlRecursive("controlID") . О методах расширения следует присутствовать непосредственно в раскрывающихся списках IntelliSense. Как показано на рис. 7, при вводе страницы с последующим нажатием клавиши FindControlRecursive метод включается в раскрывающийся список IntelliSense вместе с другими методами класса Control .

методы расширения включены в раскрывающиеся окна IntelliSense

Рис. 07. методы расширения включены в раскрывающиеся меню IntelliSense (щелкните, чтобы просмотреть изображение с полным размером)

Шаг 2. Проверка отображаемых ID изменений

На этом этапе декларативная разметка элемента управления содержимым должна выглядеть следующим образом:

На рис. 3 показана страница при просмотре в конструкторе Visual Studio.

страница включает три веб-элемента управления: текстовое поле, кнопку и метку.

Рис. 03. страница включает три веб-элемента управления: текстовое поле, кнопку и метку (щелкните, чтобы просмотреть изображение с полным размером).

Откройте страницу в браузере и просмотрите исходный код HTML. Как показано ниже, id значения HTML-элементов для элементов управления TextBox, Button и Label представляют собой сочетание ID значений веб-элементов управления и ID значений контейнеров именования на странице.

Как отмечалось ранее в этом руководстве, как Главная страница, так и ее элементов управления ContentPlaceHolder служат контейнерами именования. Как следствие, и вносят отображаемые ID значения вложенных элементов управления. Возьмем id атрибут текстового поля, например: ctl00_MainContent_Age . Помните, что значение ID элемента управления TextBox было Age . Он имеет префикс с ID ным значением элемента управления ContentPlaceHolder MainContent . Кроме того, это значение добавляется с префиксом ID значения главной страницы ctl00 . Результат «NET» является id значением атрибута, состоящим из ID значений главной страницы, элемента управления ContentPlaceHolder и самого текстового поля.

Это поведение показано на рис. 4. Чтобы определить отображаемые id текстового поля Age , начните со значения ID элемента управления TextBox Age . Затем наработаем вверх по иерархии элементов управления. В каждом контейнере именования (эти узлы имеют цвет печь) добавьте префикс к текущему отображаемому id с id контейнера именования.

Отображаемые атрибуты идентификатора основываются на значениях ИДЕНТИФИКАТОРов контейнеров именования.

Рис. 04. отображаемые id атрибуты основаны на ID значениях контейнеров именования

Так как Главная страница выступает в качестве контейнера именования, веб-элементы управления, определенные на главной странице, также имеют измененные значения id атрибутов. Например, метка DisplayDate , добавленная на главную страницу, в учебнике Создание макета на уровне сайта с помощью главных страниц содержит следующую подготовленную разметку:

Обратите внимание, что атрибут id включает значение ID главной страницы ( ctl00 ) и ID значение веб-элемента управления Label ( DateDisplay ).

Как определить Control ID

Так как все действия по работе с элементами диалогового окна требуют знания идентификатора (Control ID) нужного нам элемента, то укажем несколько программ, которые позволяют легко определять ID элемента. Скачайте и установите одну из следующих бесплатных программ: WinSpy, WindowDetective, WinID, Spy++. Это далеко не весь перечень и существуют другие аналогичные утилиты, более подробную информацию можно найти в интернете с помощью Google.

Вот так, например, выглядит программа WinSpy.

Программа WinSpy


Программа WinSpy

Запустите установку и остановитесь на той странице, где расположен элемент у которого нужно определить идентификатор. Вам достаточно перетащить "прицел" с окна программы на элемент на нашем диалоговом окне и мы получим всю ифнормацию о данном элементе, включая Control ID.

Получение Control ID


Получение Control ID

Следует заметить, что Control ID будет меняться в команде Диалог - Установки, если вы в дальнейшем вставите дополнительные контролы выше данного элемента. В этом случае, вам нужно будет заново узнать его ID и внести соответствующие изменения, где это необходимо.

Смотрите также

Eonza automation software - free, open source cross-platform program for easy creation and management of scripts. Gentee script programming language - Free, open source and cross-platform programming language for automation.

Показывает, как элементы управления ContentPlaceHolder служат в качестве контейнера именования и, следовательно, программно работают с сложностью элемента управления (через Финдконтрол). Рассматриваются эти проблемы и способы их обхода. Также обсуждается программный доступ к результирующему значению ClientID.

Microsoft Windows MSI AppLocker и ИД журнала скриптов

Код события Объяснение
8028 Сценарий аудита и MSI Windows политика блокировки (WLDP), вызванная самими хостами сценария. Примечание. В сторонних сценариях не существует правоприменения WDAC.
8029 Файл block script/MSI
8036 Объект COM был заблокирован. Дополнительные информацию о авторизации объектов COM см. в приложении Allow COM object registration in a Защитник Windows Application Control.
8038 Подписание информационного события коррелирует с событием 8028 или 8029. Для каждой подписи файла скрипта создается одно событие 8038. Содержит общее количество подписей в файле скрипта и индекс того, какая подпись это. Unsigned script files will generate a single 8038 event with TotalSignatureCount 0. Коррелирует в "Системе" часть данных событий в статье "Корреляция activityID".

Параметры политики целостности системы

Значения правил политики WDAC можно извлечь из поля "Параметры" в разделе Детали события целостности кода 3099. Чтобы разообразить значения, сначала преобразуем значение hex в двоичное. Далее используйте битные адреса и их значения из таблицы ниже, чтобы определить состояние каждого варианта правил политики.

Необязательный интеллектуальный Graph безопасности (ISG) или управляемый установщик (MI) диагностические события

Если в политике WDAC включено либо isG, либо MI, вы можете по желанию включить события 3090, 3091 и 3092 для предоставления дополнительных диагностических сведений.

Код события Объяснение
3090 Разрешить файл исполняемого/dll
3091 Файл аудита, исполняемый/dll
3092 Файл block executable/dll

События 3090, 3091 и 3092 создаются на основе кода состояния, который зависит от того, прошел ли двоичный код политику независимо от того, какую репутацию он получил и был ли разрешен назначенным mi. Шаблон SmartLocker, который отображается в событии, должен указывать причины сбой/сбой двоичного кода. Только одно событие создается на двоичный пропуск/сбой. Если и ISG, и MI отключены, события 3090, 3091 и 3092 не будут созданы.

Шаблон SmartLocker

Ниже приведены поля, которые помогают диагностировать, что указывает событие 3090, 3091 или 3092.

Имя Объяснение
StatusCode STATUS_SUCCESS указывает, что двоичный код прошел активные политики WDAC. Если это так, создается событие 3090. Если нет, создается событие 3091, если политика блокировки находится в режиме аудита, а событие 3092 создается, если политика находится в режиме обеспечения выполнения.
ManagedInstallerEnabled Политика доверяет mi
PassesManagedInstaller Файл, исходимый из доверенного MI
SmartlockerEnabled Политика доверяет ISG
PassesSmartlocker Файл имел положительную репутацию
AuditEnabled True, если политика находится в режиме аудита, в противном случае она находится в режиме обеспечения выполнения

Включение диагностических событий ISG и MI

Чтобы включить 3091 событие аудита и 3092 событий блокировки, необходимо создать регки TestFlags со значением 0x100. Это можно сделать с помощью следующей команды PowerShell:

Чтобы включить 3090 допустимых событий и событий 3091 и 3092, вместо этого необходимо создать регки TestFlags со значением 0x300. Это можно сделать с помощью следующей команды PowerShell:

Шаг 4. Использование правильного значения атрибута id в скрипте на стороне клиента

Проблема этого подхода заключается в том, что при использовании главных страниц (или других элементов управления контейнера именования) отображаемый HTML- id не является синонимом свойства ID веб-элемента управления. Первым наклона может быть посещение страницы в браузере и просмотр источника, чтобы определить фактический атрибут id . Зная значение, отображаемое id , можно вставить его в вызов getElementById , чтобы получить доступ к элементу HTML, с которым необходимо работать с помощью клиентского скрипта. Этот подход является менее идеальным, поскольку некоторые изменения в иерархии элементов управления страницы или изменения свойств ID элементов управления именованием изменяют результирующий id атрибут, тем самым нарушая код JavaScript.

Приведенный выше код вставляет значение свойства ClientID Age текстового поля в вызов JavaScript для getElementById . Если открыть эту страницу в браузере и просмотреть исходный код HTML, вы найдете следующий код JavaScript:

Обратите внимание, что в вызове getElementById отображается правильное значение id атрибута ctl00_MainContent_Age . Так как это значение вычисляется во время выполнения, оно работает независимо от последующих изменений в иерархии элементов управления страницы.

В этом примере JavaScript просто показано, как добавить функцию JavaScript, которая правильно ссылается на HTML-элемент, отображаемый серверным элементом управления. Чтобы использовать эту функцию, необходимо создать дополнительный код JavaScript для вызова функции при загрузке документа или при выполнении определенного действия пользователя. Дополнительные сведения об этих и связанных разделах см. в статье Работа со сценарием на стороне клиента.

Читайте также: