Получение имени пространства имен не найдено для пользовательского элемента управления ASP.net

Поэтому у меня возникают проблемы, когда я пытаюсь опубликовать сайт. Я в Visual Studio 2008 SP1.

У меня есть множество пользовательских элементов управления, и на нескольких страницах я использую их программно.

У меня есть ссылка на страницу aspx

<%@ Reference Control="~/UserControls/Foo.ascx" %>

Затем по коду я использую

ASP.usercontrols_foo newFoo control = (ASP.usercontrols_foo)Page.LoadControl("~/UserControls/Foo.ascx");

Если я перейду на страницу, она будет работать нормально, но когда я перейду к публикации веб-сайта, я получаю ошибку времени компиляции.


person Joel Barsotti    schedule 05.05.2009    source источник


Ответы (8)


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

Кстати: он строится, если вы снимите флажок «Разрешить обновлять этот предварительно скомпилированный сайт» (щелкните правой кнопкой мыши веб-сайт, выберите страницы свойств, параметр MSBuild)

Но мне нужно, чтобы сайт был обновляемым.

person Riaz Hosein    schedule 24.08.2009
comment
1+. Раньше у меня была такая же проблема, так как я не мог ее решить, я использовал отражение. Хотелось бы узнать, как решить эту проблему. - person Cleiton; 24.08.2009

У меня была такая же проблема - на самом деле, в моем случае я мог бы заставить ее скомпилировать и создать свой веб-сайт, но при автоматической сборке он резко взорвался.

Попробуйте заменить свой код следующим образом:

ASP.usercontrols_foo newFoo control = (ASP.usercontrols_foo)Page.LoadControl("~/UserControls/Foo.ascx");

с участием

USERCONTROLS_Foo newFoo control = (USERCONTROLS_Foo)Page.LoadControl("~/UserControls/Foo.ascx");

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

person Bob Palmer    schedule 10.11.2009

Укажите пространство имен для пользовательского управления (см. Динамически загружать пользовательский элемент управления (ascx) на веб-сайте asp.net).

person cestbienmoi    schedule 23.04.2010

Я нашел для этого решение. Если я объявлю элементы управления в пользовательском пространстве имен, я могу использовать элементы управления напрямую, не используя ASP или не ссылаясь на него на странице aspx.

person ratnesh    schedule 16.07.2010

Возможно, это связано с тем, что конкретный тип недоступен. Можете ли вы изменить ссылку на элемент управления, чтобы тип и приведение использовали только базовый класс Control:

Control control = Page.LoadControl("~/UserControls/Foo.ascx");
person Mike    schedule 24.08.2009

Да, я могу передать его в Control. Но затем я теряю прямой доступ к методам в пользовательском элементе управления.

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

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

<%@ Register src="CategoryRows.ascx" tagname="CategoryRows" tagprefix="abc" %>
<abc:CategoryRows ID="CategoryRows" runat="server" />

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

person Riaz Hosein    schedule 24.08.2009
comment
Риаз, Вы публикуете свой сайт с установленным флажком Использовать фиксированное именование и одностраничные сборки? - person Cleiton; 24.08.2009
comment
Я пробовал использовать как Использовать фиксированное именование, так и одностраничные сборки, отмеченные и не отмеченные. (Разрешить обновлять этот предварительно скомпилированный сайт проверяется в обоих случаях). Я получаю ту же ошибку: имя типа или пространства имен some_user_control_ascx не существует в пространстве имен ASP (отсутствует ссылка на сборку?) - person Riaz Hosein; 25.08.2009

Приведение пользовательского элемента управления может создать много проблем. Мой подход состоит в том, чтобы создать класс (скажем, класс управления), поместить все свойства и метод, которые вам нужны после преобразования, и унаследовать этот класс от System.Web.UI.UserControl. Затем в вашем коде управления пользователем файл вместо System.Web.UI.UserControl пользователя этого класса управления.

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

person ratnesh    schedule 14.07.2010
comment
Это не удобно, если вам нужно загружать динамически. Для динамической загрузки требуется Page.LoadControl, который возвращает только Control. Во всяком случае, мне пришлось бы получить все мои страницы, чтобы указать возможность загрузки различных пользовательских элементов управления. - person Joel Barsotti; 15.07.2010
comment
Даже если элемент управления добавлен динамически. мы всегда можем передать элемент управления его базовому классу. '-------------------------- ctrl = Page.LoadControl (~ / DashBoardControl / BroadCastView.ascx) PlaceHolder1.Controls.Add (ctrl) With DirectCast (ctrl, BraodCastView) Если не ctrl, то ничего не значит '------------------------------------- ------------ здесь BraodCastView - это базовый класс для BroadCastView.ascx, это никогда не перестает работать. - person ratnesh; 16.07.2010

Пожалуйста, проверьте:

У вас есть файл website.publishproj?
Если он существует, удалите, попробуйте еще раз и опубликуйте код.

person Muhammad Bilal    schedule 20.04.2016