VS2015 - IntelliSense не работает в представлениях бритвы в библиотеке классов

Мне сложно описать точную проблему, но, похоже, это "просто" проблема IntelliSense, которая отображается только в виде бритвы (.cshtml). Я смотрел на это в течение 2 дней, поэтому я мог действительно помочь.

Я использую VS2015 Pro, запустил новое приложение Web MVC (WebApplication2), используя стандартный шаблон. Внутри этого приложения все работает отлично.

Теперь я добавил проект библиотеки классов (по умолчанию, а не шаблон "Пакет" ), и добавил к нему пакеты WebPages, MVC и razor nuget (в случае, если это имеет значение). Проблема становится видимой, как только я создаю новое представление в библиотеке классов. Похоже, что все ссылки на системные библиотеки недоступны в файле cshtml. Без открытых файлов я не получаю никаких ошибок, но когда я открываю представление, все системные классы имеют под ними красную квадратную строку, а в списке ошибок (Build + IntelliSense) неожиданно появляется много ошибок для каждой системы * библиотеки, например

The type or namespace name 'Mvc' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)

К ним относятся Linq и WebApplication2 (тестовый проект), поэтому не только System.Web.

Вещи, которые я проверил и сделали основы на аналогичных ответах на стек:

  • Web.config в папке "Представления" содержит правильные версии, также попробовал просто скопировать файл из веб-приложения.
  • Переустановил пакеты nuget (Mvc, Razor, Webpages).
  • Сброс пользовательских данных и удаление папки .vs.
  • Копировать локаль в сборку установлено значение true.

Фактический случай, когда мы обнаружили это наше большое веб-приложение, которое отлично работает в VS2010, но затем мы решили перейти на 2015 год и .Net 4.6. Представления в библиотеке классов помечены как внедренный ресурс и загружаются с использованием поставщика виртуального пути. Вышеприведенный случай представляет собой супер упрощенный воспроизводимый проект, симптомы одинаковы на компьютерах моих и моих двух коллег.

Если я пропустил важную информацию, просто спросите.

Изображение, отображающее проблему Изображение, визуализирующее проблему

Ответ 1

Ответ в статье Стивен Мюкке прокомментировал, когда я начал работать в правильном направлении. Решение - это смесь, вероятно, моей путаницы в том, какая конфигурация должна быть где, и что такое обходное решение для чего-то...

  • Задайте путь [Выходной путь] проекта библиотеки классов к [bin/]. Мохаммад Чехаб упоминает об этом в своем (в настоящее время в автономном режиме?) Блоге, который упоминался в этой статье: http://thetoeb.de/2014/01/05/enabling-mvc5-intellisense-in-a-classlibrary-project/

  • В вашей папке [ClassLibrary/Views] вы должны иметь Web.config, который включает в себя правильные версии бритвы и пространства имен. Я просто скопировал содержимое Web.config из нашего рабочего проекта веб-приложения и добавил/изменил некоторые пространства имен. Пример ниже.

  • В корневой папке [ClassLibrary] вы должны изменить App.config, чтобы он также содержал раздел system.web с параметром компиляции. Пример ниже.

После того, как вы изменили их на чистое, закройте решение, удалите папки bin, откройте решение, и для меня он, наконец, все снова работает. У меня есть спорадическая проблема с блокировкой System.Web.Mvc.xml, возможно, побочным эффектом изменения выходного пути, который MS не предвидел или что-то еще... Возможно, об этом не о чем беспокоиться.

Надеюсь, что когда-нибудь это поможет какой-то плохой гуглинговой душе.

Project/Views/Web.config

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>

  <system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
  </system.web>
</configuration>

Project/App.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.6" />
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>