2009-05-05 3 views
2

Так что у меня возникают проблемы при попытке публикации веб-сайта. Я нахожусь в visual studio 2008 sp1.Получение имени пространства имен для элемента управления ASP.net

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

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

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

Тогда на код опережать я использую

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

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

+0

Создан ли ваш сайт? – Cerebrus

ответ

5

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

BTW: Он строит, если вы снимите флажок «Разрешить предкомпилированного сайт обновляемым» (Щелкните правой кнопкой мыши на веб-сайте, выберите Property Pages, MSBuild Option)

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

+0

1+, Раньше у меня была такая же проблема, как я не мог ее решить. Я использовал отражение. Я хотел бы знать, как решить эту проблему. – Cleiton

0

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

Control control = Page.LoadControl("~/UserControls/Foo.ascx"); 
0

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

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

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

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

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

+0

Riaz, Вы публикуете свой веб-сайт с помощью «Использовать фиксированные имена и отдельные страницы»? – Cleiton

+0

Я пробовал проверять и отменять оба параметра «Использовать фиксированные имена и отдельные узлы». («Разрешить обновление этого предварительно скомпилированного сайта» проверяется в обоих случаях) Я получаю ту же ошибку: «Тип или имя пространства имен« some_user_control_ascx »не существует в пространстве имен« ASP »(вам не хватает ссылки на сборку ?) " –

2

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

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

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

с

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

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

0

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

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

+0

Это неточно, если вам нужно динамически загружать. Для загрузки динамически требуется Page.LoadControl, который возвращает команду Control. Если что-нибудь мне понадобится, чтобы получить все мои страницы, чтобы указать возможность загрузки различных пользовательских элементов управления. –

+0

Даже если элемент управления динамически добавлен. мы всегда можем отнести элемент управления к его базовому классу. '-------------------------- ctrl = Page.LoadControl ("~/DashBoardControl/BroadCastView.ascx") PlaceHolder1.Controls. Добавить (ctrl) С DirectCast (ctrl, BraodCastView) Если нет ctrl is Nothing Then '----------------------------- -------------------- здесь BraodCastView - это базовый класс для BroadCastView.ascx , это никогда не сработает. – ratnesh

1

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

0

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

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