Пользовательский элемент управления, встроенный в страницу, изменяет ClientID элементов управления.

У меня есть пользовательский элемент управления (.ascx), который я встраиваю в свою страницу (.aspx), как показано ниже:

<%@ Register TagName="UI" TagPrefix="my" Src="~/userControls/UI.ascx" %> 
<my:UI runat="server" ID="mytestui" />

Когда страница загружается, элементы управления (текстовые поля, выпадающие списки и т. Д.) Внутри пользовательского элемента управления изменяются автоматически. Скажем, у меня есть текстовое поле с именем txtTest, оно меняется на mytestui_txtTest.

Как вы можете видеть, он берет вышеуказанный идентификатор пользовательского элемента управления и добавляет его к элементу управления.

Есть ли способ предотвратить это?

2 ответа

Решение

Это происходит потому, что ваш контроль является подклассом UserControl класс, который реализует INamingContainer интерфейс. По умолчанию все элементы управления, которые реализуют этот интерфейс, дополняют идентификаторы детей своими собственными идентификаторами, таким образом гарантируя, что каждый идентификатор на странице уникален.

Чтобы избежать этого, у вас есть два варианта:

  1. Создать серверный элемент управления, наследуя не от UserControl но из Control класс прямо. Этот не реализует INamingContainer, Однако у вас не будет файла разметки, и вам придется генерировать все элементы управления программно.

  2. [Редактировать: только ASP.NET 4] Использовать ClientIDMode="Static" для дочерних элементов управления. Этот режим гарантирует, что идентификаторы сервера и клиента элемента управления точно совпадают. В этом случае разработчик должен убедиться, что этот элемент управления используется только один раз на странице, чтобы избежать дублирования идентификаторов.

Какую версию.Net вы используете? Если>= 4.0, вы можете использовать ClientIDMode="Static" как сказал Андрей. Вы можете установить его на уровне управления или страницы.

Другие вопросы по тегам