Серверные элементы управления в пользовательском элементе управления равны нулю, когда пользовательский элемент управления служит базовым пользовательским элементом управления (asp.net). - PullRequest
0 голосов
/ 04 июня 2010

Не думаю, что полностью понимаю, как ASP.NET наследует элементы управления. У меня есть пользовательский элемент управления, ucBase, который имеет метку asp.net в файле ascx. Код позади ссылается на метку, и он отлично работает во время выполнения, если элемент управления не является родительским для другого родительского пользователя.

Если у меня есть другой пользовательский элемент управления, ucChild, унаследованный от ucBase, метка в коде ucBase всегда будет нулевой. ucChild не имеет элементов управления в своем файле ascx

Серверные элементы управления (например, метка) должны быть объявлены в файле ascx, а не созданы программно.

Что нужно сделать, чтобы ucBase увидел свои собственные элементы управления, когда это родительский пользовательский элемент управления?

1 Ответ

1 голос
/ 04 июня 2010

Выпуск:

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

Связь между разметкой и вашим выделенным кодом осуществляется через частичный класс .designer.cs, который поставляется с вашим пользовательским элементом управления. Этот дизайнерский файл содержит объявления для всех объектов в вашей разметке. Это в основном украшает класс code-behind с кучей полей, которые являются нулевыми ссылками на объекты - они будут инициализированы с фактическими экземплярами при запуске скомпилированного кода разметки.

Когда вы наследуете из файла .ascx, вы наследуете все эти заполнители пустых объектов. Однако, поскольку разметка в вашем новом элементе управления не совпадает с родительским элементом управления, ни один из этих объектов фактически не создается, если разметка нового элемента управления не содержит соответствующей разметки и когда он анализируется и компилируется, все ссылки остаются ноль. Имеет ли это смысл?

Исправление:

Лучший способ сделать это - сделать ваши пользовательские элементы управления самодостаточными, то есть отдавать предпочтение композиции на основе кода, а не на основе разметки. Другими словами, вместо использования разметки настройте пользовательский элемент управления с помощью Page_Init и добавьте все необходимые элементы управления в коллекцию Controls в коде позади.

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

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