Не удается получить доступ к экземпляру пользовательского унаследованного веб-управления со страницы с выделенным кодом в проекте веб-приложения - PullRequest
2 голосов
/ 02 марта 2010

Я унаследовал от 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:

Чтобы уточнить, что я пытался достичь, было:

  1. Проект веб-приложения
  2. Унаследованный файл класса веб-управления в той же сборке (т. Е. Не ссылается на отдельную скомпилированную DLL)
  3. Элемент управления добавлен на страницу через разметку времени разработки
  4. Экземпляр элемента управления, на который ссылается код страницы позади

РЕДАКТИРОВАТЬ: После перечитывания комментариев Брайана, я наконец понял. На самом деле это очень просто: все, что вам нужно сделать, это добавить Assembly = "WebApplication1" в директиву <% @ Register%> в разметке и добавить "WebApplication1" «. префикс к директиве пространства имен . Итак:

<%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>

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

Джордан Ригер

Ответы [ 2 ]

1 голос
/ 02 марта 2010

У вас есть что-то шаткое. Пара вещей для проверки ...

Во-первых, убедитесь, что в вашем коде нет директивы CodeFile. Он должен быть скомпилирован в ту же сборку, что и ваши классы страниц. Убедитесь, что директива Inherits правильная. Это звучит очень похоже на то, что вы изменяете класс, который не является тем, о котором вы думаете.

Во-вторых, убедитесь, что файл конструктора использует правильное объявление типа для вашего элемента управления. Если там написано «WebControl» или что-то, кроме вашего типа, что я подозреваю, это проблема. Вам может потребоваться сообщить Visual Studio, где находится код для этого элемента управления, установив корень приложения в Свойствах проекта. Именно так Visual Studio знает, как разрешить путь «~» во время разработки.

Если это не сработает ... напишите код.

UPDATE
Хорошо, причина того, что вы получаете исходную ошибку, заключается в том, что элемент управления не объявлен в файле конструктора. Если его нет в файле конструктора, он не существует и, следовательно, вы получаете эту ошибку: «WelcomeLabel1» не является членом «WebApplication1._Default». Одна из причин, по которой это может произойти, это то, что вы не регистрирует элемент управления или не регистрирует его должным образом ... поэтому Visual Studio понятия не имеет, что с ним делать, это все равно что объявлять какой-то случайный элемент, который не имеет определения:

<bp:WhatIsThis ID="someID" runat="server">

Visual Studio не будет обновлять ваш файл .designer здесь, потому что он не имеет ни малейшего представления о том, что представляет этот объект. Я предполагаю, что здесь происходит то же самое.

ОБНОВЛЕНИЕ 2: Вы должны включить файл .cs в свой проект. Этот шаг, вероятно, отсутствует в пошаговом руководстве, поскольку он нацелен на веб-сайт, а не на WAP. Вот почему ваше пространство имен пустое.

0 голосов
/ 02 марта 2010

Иногда при открытии конструктора он корректно добавляется в файл designer.cs, содержащий ссылки на элементы управления. Это то, что, вероятно, отсутствует. Не уверен почему, у меня отлично работает ...

Есть ошибка сборки или ошибка компиляции, или директива @Page показывает ошибку?

НТН.

...