Я унаследовал от ASP.NET WebControl, чтобы добавить некоторые дополнительные функции. Я проверил свой элемент управления на пустом веб-сайте ASP.NET (созданном с помощью «Файл»> «Новый веб-сайт ...»), и он работал нормально. Но я не могу заставить его работать, когда добавляю его в проект веб-приложения (созданный через Файл> Новый проект ...> Visual Basic> Web> ASP.NET Web Application. Я лично предпочитаю веб-сайты для простоты разработки, но руководство проекта, с которым я сейчас работаю, хочет сохранить его веб-приложением (им нравится, как оно предварительно компилирует весь код страницы в одну DLL в папке Bin.)
Чтобы изолировать проблему, я попытался воспроизвести ее с помощью простого MSDN Walkthrough: разработка и использование пользовательского серверного элемента управления . К моему удивлению, у меня возникла та же проблема: если вы встраиваете его в проект веб-приложения ASP.NET, а затем пытаетесь получить доступ к экземпляру элемента управления из кода программы, вы получаете ошибку компиляции BC30456: «WelcomeLabel1 не является членом WebApplication1._Default. Например, в поле «Загрузка страницы» напишите:
Me.WelcomeLabel1.Text = "foo"
Однако, если вы просто удалите эту строку кода позади, она скомпилируется правильно, и браузер покажет страницу с правильно отформатированной меткой. Для меня это ошибка в компиляторе / фреймворке, потому что, если элемент управления правильно внедряется в страницу, он всегда должен быть доступен в коде, верно?
Есть идеи? Я полагаю, что мог бы скомпилировать свой элемент управления в сборку, как это было предложено далее в пошаговом руководстве, но это кажется излишним.
Интересно, что я могу использовать FindControl, чтобы получить ссылку на WelcomeLabel, но я не могу привести его к соответствующему типу. Это приводит к ошибке "Невозможно привести объект типа 'Samples.AspNet.VB.Controls.WelcomeLabel' к типу 'WebApplication2.Samples.AspNet.VB.Controls.WelcomeLabel'." Я пробовал каждую комбинацию пространств имен и импорта, о которой только мог подумать, даже добавляя объявления в файл designer.vb вручную, и я не могу заставить это работать, если, конечно, я не переключаюсь на проект веб-сайта, который я не могу сделать.
ОБНОВЛЕНИЕ 1.1:
Чтобы уточнить, что я пытался достичь, было:
- Проект веб-приложения
- Унаследованный файл класса веб-управления в той же сборке (т. Е. Не ссылается на отдельную скомпилированную DLL)
- Элемент управления добавлен на страницу через разметку времени разработки
- Экземпляр элемента управления, на который ссылается код страницы позади
РЕДАКТИРОВАТЬ: После перечитывания комментариев Брайана, я наконец понял. На самом деле это очень просто: все, что вам нужно сделать, это добавить Assembly = "WebApplication1" в директиву <% @ Register%> в разметке и добавить "WebApplication1" «. префикс к директиве пространства имен . Итак:
<%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>
И теперь у вас не должно возникнуть проблем с созданием экземпляра элемента управления с помощью разметки и доступа к экземпляру из выделенного кода, независимо от того, помещаете ли вы файл класса элемента управления в App_Code или где-либо еще.
Джордан Ригер