Visual Studio 2008 теряет intellisense для ASCX с CodeBehind (но работает для CodeFile)? - PullRequest
9 голосов
/ 02 октября 2009

У меня есть следующее определение вверху моего файла .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, которую я действительно хочу исправить:)

Будет публиковать больше, как я определю, какие файлы могут иметь отношение к вопросу ...

Ответы [ 6 ]

5 голосов
/ 15 октября 2009

Вы проверили действие по сборке файлов вашего проекта? Я продублировал вашу проблему, установив действие Build для ArticleView.ascx.designer.cs на None. Я также могу скомпилировать при использовании CodeFile и т. Д., Я на 99% уверен, что это ваша проблема.

4 голосов
/ 14 октября 2009

Вам не хватает файла [your-file] .ascx.designer.cs, который связывает ваши элементы управления с вашим кодом.

Как и в предложениях CitizenBane, вам нужно щелкнуть правой кнопкой мыши файл (или папки, или весь веб-проект) и выбрать «Преобразовать в приложение». Visual Studio проверит ваши файлы ascx / aspx для серверных элементов управления и сгенерирует этот файл конструктора для вас.

Я сам столкнулся с этим в гораздо большем масштабе ... C #: Как преобразовать проект веб-сайта в веб-проект

Проверьте ответ.

4 голосов
/ 13 октября 2009

Это случилось со мной раньше. Попробуйте щелкнуть правой кнопкой мыши ascx / aspx и нажмите «Преобразовать в веб-приложение». Возможно, вам просто не хватает сгенерированных элементов управления. Если вы не видите его в контекстном меню, сначала удалите созданный дизайнером файл.

3 голосов
/ 02 октября 2009

CodeBehind устарела в .NET 2.0. Я считаю, что только <= 1.1 использует "CodeBehind". Теперь это "CodeFile", как вы говорите. </p>

Почему вы не хотите компилировать свой код? Если вы компилируете, вам не нужно развертывать ваши .cs файлы ...

2 голосов
/ 15 октября 2009

Почему у вас есть код для вашего элемента управления ascx как код страницы с именем aspx? UserControl (ascx) обычно имеет код позади

CodeBehind="ArticleView.ascx.cs" 

вместо того, что вы перечислили

CodeBehind="ArticleView.aspx.cs"

Обратите внимание на aspx вместо ascx для пользовательского элемента управления.

Это может быть вашей проблемой ... простая опечатка или ошибка копирования и вставки. На ум приходит пара вариантов:

  1. Возможно, у вас есть элемент управления ascx (пользовательский элемент управления), указанный выше, с использованием файла кода, который наследуется от System.Web.UI.Page вместо System.Web.UI.UserControl (который может вызывать ошибки Visual Studio) .
  2. У вас есть UserControl, указывающий на код для страницы aspx с тем же именем. Проблема, аналогичная # 1, из-за которой Visual Studio может запутаться.
  3. Ваши файлы называются ArticleView.ascx и ArticleView.aspx.cs. Это может сбить с толку Visual Studio, поскольку я считаю, что VS может ожидать особого соглашения об именах.

Для пользовательских элементов управления (ascx) ваши файлы должны иметь имя:

  • ArticleView.ascx (CodeBehind = "ArticleView.ascx.cs" Inherits = "[NAMESPACE] .ArticleView")
  • ArticleView.ascx.cs (наследуется от System.Web.UI.UserControl)
  • ArticleView.ascx.designer.cs

Для Web From (aspx) ваши файлы должны иметь имя:

  • ArticlePage.aspx (CodeBehind = "ArticlePage.aspx.cs" Inherits = "[NAMESPACE] .ArticlePage")
  • ArticlePage.aspx.cs (наследуется от System.Web.UI.Page)
  • ArticlePage.aspx.designer.cs
1 голос
/ 12 января 2012

Это случилось со мной в VS2010 после обновления проекта веб-приложения до .net 4.0.

Ответ состоял в том, чтобы убедиться, что targetFramework = "4.0" установлено в разделе system.web / compilation в web.config

т.е.

<system.web>
    <compilation debug="true" targetFramework="4.0">
</system.web>
...