Странное поведение на композитном настраиваемом элементе управления asp.net - у кого-нибудь есть ответ? - PullRequest
0 голосов
/ 19 октября 2011

Сценарий

Я сейчас работаю над большим интранет-сайтом с большим количеством веб-форм и пытаемся заменить 500+ форм общей базой данных- движок форм, который будет динамически добавлять различные поля и проверки и связывать любые выпадающие привязки и так далее.Пока все хорошо.

Как мы это делаем, довольно легко;у нас есть процедура, вызываемая во время инициализации страницы, которая получает соответствующие определения полей и соответствующие валидаторы (как клиентские, так и пользовательские) и в основном добавляет каждое из них в качестве заполнителя.

В рамках полномочий нам необходимо создать несколько составных элементов управления для таких вещей, как «платформа», которые имеют некоторые специфические функциональные возможности на стороне сервера, которые мы не можем сделать общими, но которые используются повсеместно.

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

Однако эти элементы управления выполняют определенные функции в Load и PreRender, где мы имеемстолкнуться с проблемой.

Проблема

Вспомните, что мы делаем все это в Init?Что ж, нам нужно для того, чтобы встроить такие вещи, как динамические пользовательские валидаторы на стороне сервера (имена методов которых мы храним в базе данных и в основном подключаемы с использованием отражения после создания экземпляра связанного элемента управления).

Мывполне способны добавить экземпляры нашего составного элемента управления таким образом, и все выглядит хорошо.Тем не менее, когда запускаются события элемента управления Load или PreRender, мы обнаруживаем странную вещь (и здесь мне нужно, чтобы вы, умные люди, помогали мне).

По сути, я получаю исключение NullReferenceException, когда хочучтобы получить доступ к любому из дочерних элементов управления на этом составном элементе управления.Это простые вещи, такие как изображение, которое я хочу скрыть (декларативное в .ascx, а не динамическое) и раскрывающийся список (в который я хотел бы вставить некоторые значения из базы данных).Странно то, что даже если я перенесу этот код в PreRender, кажется, что эти элементы управления не создаются, даже если им нужно дать понять, что они объявлены декларативно, и мы находимся на этапе PreRender.

Вот типичный фрагмент (извинения, он в VB.NET 2.0 из-за клиентских ограничений - вот как оно есть; -):

Me.EnsureChildControls()
IsRequiredFieldIndicator.Visible=IsRequired
If Not IsPostBack Then
    LoadDropDownListFromBLL()
End

Исключение возникает, когда мы пытаемся сделатьчто-то с любым фактическим дочерним элементом управления, таким как элемент управления IsRequiredFieldIndicator (который является изображением).Другими словами, его там нет.Как ни странно, когда мы проверяем, что происходит, свойство ChildControlsCreated было установлено в значение true, но содержимое коллекции Controls ничего не показывает (пусто).

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

Да, и прежде чем кто-то это предложит, я убедился, что составной элемент управления реализует интерфейс INamingContainer, но безрезультатно.

Кто-нибудь когда-нибудь сталкивался с чем-то подобным и, если да, то как вывокруг этого?

Большое спасибо,

Джон

1 Ответ

0 голосов
/ 27 октября 2011

ОК, я понял это. Это довольно просто (не всегда ли?). По сути, ответ заключается в том, что вы просто не можете просто создать новый экземпляр своего пользовательского элемента управления динамически и ожидать, что он «просто сработает». Вам нужно использовать LoadControl () (который, конечно, я знал, но, эй, совершенно не хватало ...). В противном случае создание экземпляра элемента управления просто с помощью new () и последующего добавления значений пропускает важный шаг, на котором декларативные элементы управления .ascx «складываются» в фактическую настройку элемента управления ... если это имеет смысл При использовании new () все казалось работающим, но, конечно, контроль пропустил этот важный шаг, который возвращал меня, чтобы укусить ..... д'оо!

...