У меня есть следующее определение вверху моего файла .ASCX:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ArticleView.aspx.cs" Inherits="MyNameSpace.ArticleView" %>
В этом элементе управления я использую блоки <% =%> для ссылки на элементы, которые я объявил в файле code-behind. Если я скомпилирую и разверну элемент управления, он работает нормально. Но в Visual Studio я получаю много ошибок времени разработки: «{некоторая переменная} не существует в текущем контексте». И Intellisense тоже ломается: он работает для членов UserControl, но не может найти своих объявленных участников. Есть и другие проблемы. В общем, все указывает на тот факт, что генерируемый класс ASP.articleview_ascx почему-то не наследуется от класса MyNameSpace.ArticleView.
Я обнаружил, что если я переключу атрибут CodeBehind на "CodeFile":
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ArticleView.aspx.cs" Inherits="MyNameSpace.ArticleView" %>
неожиданно Intellisense работает и все ошибки времени проектирования исчезают. Но я не хочу делать компиляцию во время выполнения или развертывать мои файлы .ASCX.CS - поэтому я не могу использовать CodeFile.
Я проверил простые вещи, например, удостоверился, что мое имя файла CodeBehind правильное и класс Inherits имеет правильное пространство имен и т. Д. (И поскольку он работает правильно после изменения атрибута на CodeFile, они должны указывать на правильное место ....) Но чего мне не хватает? Почему он не может обработать атрибут CodeBehind?
Спасибо
Стив
Обновление: из ветки ниже - основной вопрос был, почему бы просто не использовать CodeFile? Ответ: когда я пытаюсь выполнить развертывание с использованием CodeFile = в моих файлах, после развертывания я получаю следующую трассировку стека (представленную полностью):
/ _ layouts / Pages / ViewPage.aspx.cs 'не существует. в System.Web.UI.Util.CheckVirtualFileExists (VirtualPath virtualPath) в System.Web.UI.TemplateParser.ProcessCodeFile (VirtualPath codeFileVirtualPath) в System.Web.UI.TemplateParser.ProcessMainDirectiveAttribute значение String имя-устройства, имя-строки String deviceName, строка )
(Это из запроса к /_layouts/Pages/ViewPage.aspx. ViewPage - это страница, на которой есть несколько других элементов управления, включая ArticleView, упомянутый в моем исходном примере. Это просто первый файл, который дает сбой - если я вернитесь к CodeBehind = в ViewPage, затем включенный ASCX с CodeFile = завершится таким же образом. Кажется, компилятор страницы жалуется, потому что унаследованный класс codebehind не может быть найден ни в одной загруженной DLL, поэтому он должен быть CS-файлом для компиляции по требованию.
Проблема здесь в том, что я не хочу развертывать файлы CS, только ASPX / ASCX. Прочитав много статей, таких как , эта замечательная , я знаю о различных новых моделях развертывания, хотя я никогда не использовал ничего, кроме проекта веб-приложений (преобразованного из VS2003, мы были поздними последователями 2005 и модель WAP уже были добавлены к тому времени, когда мы перешли с 2003 года.) Во многих проектах VS2005 / 8 у меня никогда не было проблем с CodeBehind =, пока эта проблема Intellisense не обнаружилась ... хотя это не так В этом случае я не могу развернуть развертывание на SharePoint, что вводит новый уровень сложности.
Поскольку я ранее не развертывал с использованием CodeFile, очень вероятно, что мне не хватает какой-то опции, которую я должен установить в VS при сборке, чтобы вызвать прекомпиляцию. Мне просто нужно иметь возможность развернуть, как я делаю сегодня, как набор ASPX / ASCX с единой кодовой библиотекой DLL. И это работает сегодня с CodeBehind = ... у него просто есть первоначально упомянутая проблема Intellisense, которую я действительно хочу исправить:)
Будет публиковать больше, как я определю, какие файлы могут иметь отношение к вопросу ...