Не удалось получить доступ к классу из app_code

У меня есть веб-сайт (не веб-приложение), который имеет default.aspx и default.aspx.cs. И в нем есть папка App_Code с классом A. Итак, default.aspx.cs. Выглядит как:

namespace test1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
}

И класс A:

namespace test1
{
    public class A
    {
        _Default mDefaultRef;
        public pageLogicIndividual(_Default defaultRef)
        {
            mDefaultRef = defaultRef;
        }
    }
}

Я могу использовать A в _Default. например. если я наберу test1., работая в классе _Default, IntelliSense покажет оба класса. Но если я наберу test1., работая в классе A, IntelliSense покажет только A. Почему я не могу использовать _Default в A?

Ошибка: имя типа или пространства имен не существует в пространстве имен (вам не хватает ссылки на сборку)

Редактировать: я попытаюсь уточнить. Работая в файле .cs, где находится класс _Default, я могу ввести test1., которое является пространством имен, и intellisense покажет мне класс _Default и класс A. Но если я работаю с файлом .cs, в котором находится класс A, и ввожу test1., которое является пространством имен, то intellisense покажет мне только класс A.


person user3532232    schedule 02.09.2014    source источник
comment
f i введите test1. IntelliSense покажет оба класса. Но если я наберу test1. в A IntelliSense покажет только A. немного сбивает с толку. Что именно за поведение?   -  person Amit Soni    schedule 02.09.2014
comment
Это не классический ASP — измените свой тег на asp.net.   -  person Paul    schedule 02.09.2014


Ответы (3)


Короче говоря, вы не можете получить доступ к классам страниц из App_code классов.
Это ограничение связано с website project моделью компиляции. Специальная папка App_code содержит общие классы (и, возможно, другие ресурсы), которые доступны страницам (и друг другу). Во время компиляции App_code сначала компилируется в одну сборку. Это ключевой момент. Страницы, элементы управления и мастер-страницы компилируются в другой(их) сборке(ях), которая может иметь ссылки на сборку App_code (но не наоборот). Так что это дорога с односторонним движением.
Никакое объявление namespace не должно обходить это поведение.
Страницы могут видеть друг друга в ASP пространстве имен (ASP.default_aspx), но страницы обычно не имеют общедоступных свойств/методов (пользовательские элементы управления .ascx обычно имеют ).
Прочтите лучшее объяснение на MSDN страницы кода программной части

person Alex Kudryashev    schedule 19.07.2016

У меня была эта проблема в прошлом.

Откройте узел папки App_Code в Visual Studio. Щелкните правой кнопкой мыши соответствующий класс, затем щелкните свойства.

На панели свойств измените Действие сборки на Компиляция.

Теперь все должно работать нормально.

person David Jiboye    schedule 02.09.2014
comment
Нет такой опции. Единственное, что у меня есть, это имя файла и полный путь - person user3532232; 03.09.2014
comment
Что за проект? Сайт или веб-проект? Кроме того, какая версия визуальной студии - person David Jiboye; 03.09.2014
comment
Это проект веб-сайта - person user3532232; 13.07.2016

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

Таким образом, вам не нужно размещать класс A внутри пространства имен test1, потому что вы можете использовать A в default.aspx.cs даже без пространства имен, но вы не можете получить доступ к другим классам страниц WebForm со страницы Webform или App_Code классов.

Кстати, если вы хотите использовать необходимые и повторно используемые методы в классе веб-формы Default, вы можете переместить эти методы в класс A, который находится под App_Code, и, как я уже сказал, вы можете использовать его во всех Web Form CodeFiles без предоставления пространства имен для Это.

person Salah Akbari    schedule 19.07.2016