Нужно ли автозаполнение механизма просмотра бритвы работать в библиотеке классов?

У нас есть модульная архитектура, в которой у нас есть несколько файлов представлений (cshtml) в отдельном проекте (библиотека классов). Как заставить работать подсветку синтаксиса и автозаполнение, если проект не является проектом MVC?

Обратите внимание, что в библиотеке классов есть контроллеры, представления, модели и т.д. У нее просто нет web.config, global.asax и т.д., Которые имел бы обычный проект mvc.

Intellisense работает для всего, кроме такой важной модели: screenshot of model error

С MVC3 RTM, если вы наводите курсор мыши на Модель, вы можете получить лучшее сообщение об ошибке:

C:\...\Index.cshtml: среда выполнения ASP.NET ошибка: нет поставщика сборки зарегистрирован для продления '.Cshtml. Вы можете зарегистрировать один в & Lt; компиляции> & л; buildProviders> раздел в machine.config или web.config. Убедитесь, что есть BuildProviderAppliesToAttribute атрибут, который включает в себя значение "Сеть" или "Все".

Поэтому я добавил это:

<compilation>
    <assemblies>
      <add assembly="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </assemblies>
    <buildProviders>
      <add
         extension=".cshtml"
         type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor"/>
    </buildProviders>
  </compilation>

Затем после добавления поставщика сборки появляется это сообщение об ошибке:

C:\...\Index.cshtml: среда выполнения ASP.NET ошибка: не удалось загрузить файл или сборку 'System.Web.WebPages.Razor' или один из его зависимости. Система не может найти указанный файл. (C:\...\machine.config строка 259)

Ответ 1

Будет работать webconfig из этот пост. Я скопировал его ниже (для потомков):

<?xml version="1.0"?>
<configuration>

    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.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=3.0.0.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.Routing" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>

    <system.web>
        <compilation targetFramework="4.0">
            <assemblies>
                <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            </assemblies>
        </compilation>
    </system.web>

</configuration>

Ответ 2

Для Visual Studio 2012/ASP.NET MVC 4 вам необходимо обновить версии сборки и добавить <add key="webpages:Version" value="2.0.0.0" /> в appSettings. Вот как выглядит мой 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=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.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=4.0.0.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.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
  </appSettings>

  <system.web>
    <compilation targetFramework="4.5">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
  </system.web>

</configuration>

Ответ 3

Я последовал за предложением Jammer и документировал, насколько я считаю, минимальный набор действий для получения проекта, подходящего для работы в качестве проекта библиотеки классов ASP.NET MVC4. Это было сделано в Visual Studio 2012 Update 4 и предназначалось для VB.Net. Впоследствии я могу включить в Visual Studio 2013 документацию для выполнения чего-то подобного, если у меня появится шанс. Вот действия, которые я предпринял:

  • Создайте новый пустой проект MVC4 с отдельным каталогом для решения (так что вы можете ясно видеть, что каталог packages с обновленными версиями ссылочных файлов является частью проекта).
  • Добавьте фиктивный контроллер, просмотр и модель для его проверки (что привело к копированию выходной DLL и просмотру другого веб-приложения после создания библиотеки классов).
  • Удалите из проекта следующие файлы:
    • Вся папка App_Start
    • Вся папка App_Data и любые другие пустые папки (моя история Mercurial не сделала это видимым, поэтому я перехожу из памяти).
    • Global.asax
    • Global.asax.vb
    • Файл Web.config в корневом и зависимом Web.Debug.config и Web.Release.config файлах. (Do не удалить Web.config из папки Views.)
  • Удалите следующие разделы из файла Web.config в папке "Виды":
    • appSettings
    • system.web
    • system.webServer
    • Вы также можете удалить строки <add namespace="System.Web.Mvc.Ajax" /> и <add namespace="System.Web.Routing" />
  • Удалите следующие ссылки из проекта (* отмеченные ссылки были ссылками на версию, которые вошли в каталог packages и имеют Copy Local и Specific Version для True).
    • System.Web.Entity
    • System.Web.ApplicationServices
    • System.ComponentModel.DataAnnotations
    • System.Data.DataSetExtensions
    • System.Web.Extensions
    • System.Web.Extensions.Design
    • System.Xml.Linq
    • System.Web.Abstractions
    • System.Web.Routing
    • System.Configuration
    • System.Web.Services
    • System.EnterpriseServices
    • Microsoft.Web.Infrastructure (1.0.0.0) *
    • Microsoft.Web.Mvc.FixedDisplayModes (1.0.0) *
    • Newtonsoft.Json (4.5.11) *
    • System.Net.Http (2.0.20710.0) *
    • System.Net.Http.Formatting (4.0.20710.0) *
    • System.Net.Http.WebRequest (2.0.20710.0) *
    • System.Web.Helpers (2.0.20710.0) *
    • System.Web.Http (4.0.20710.0) *
    • System.Web.Http.WebHost (4.0.20710.0) *
  • Удалите из параметров проекта следующие импорты по всему проекту:
    • System.Xml.Linq
    • System.Collections.Specialized
    • System.Configuration
    • System.Web.Caching
    • System.Web.Mvc.Ajax
    • System.Web.Routing
    • System.Web.SessionState
    • System.Web.Security
    • System.Web.Profile
    • System.Web.UI
    • System.Web.UI.WebControls
    • System.Web.UI.WebControls.WebParts
    • System.Web.UI.HtmlControls
  • Удалите из packages.config следующее:
    • < package id = "Microsoft.AspNet.Mvc.FixedDisplayModes" version = "1.0.0" targetFramework = "net40" / >
    • < package id = "Microsoft.AspNet.WebApi" version = "4.0.20710.0" targetFramework = "net40" / >
    • < package id = "Microsoft.AspNet.WebApi.Client" version = "4.0.20710.0" targetFramework = "net40" / >
    • < package id = "Microsoft.AspNet.WebApi.Core" version = "4.0.20710.0" targetFramework = "net40" / >
    • < package id = "Microsoft.AspNet.WebApi.WebHost" version = "4.0.20710.0" targetFramework = "net40" / >
    • < package id = "Microsoft.Net.Http" version = "2.0.20710.0" targetFramework = "net40" / >
    • < package id = "Microsoft.Web.Infrastructure" version = "1.0.0.0" targetFramework = "net40" / >
    • < package id = "Newtonsoft.Json" version = "4.5.11" targetFramework = "net40" / >
  • Удалите из папки пакетов следующие подкаталоги:
    • Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.0
    • Microsoft.AspNet.WebApi.4.0.20710.0
    • Microsoft.AspNet.WebApi.Client.4.0.20710.0
    • Microsoft.AspNet.WebApi.Core.4.0.20710.0
    • Microsoft.AspNet.WebApi.WebHost.4.0.20710.0
    • Microsoft.Net.Http.2.0.20710.0
    • Microsoft.Web.Infrastructure.1.0.0.0
    • Newtonsoft.Json.4.5.11

Это оставляет мне следующее:

  • Проект библиотеки классов VB.Net, ориентированный на .NET Framework 4 (хотя я предполагал, что это будет 4.5 - я думаю, либо работает).
  • Следующие ссылки, не относящиеся к стандарту .NET(отмеченные ссылки должны иметь Copy Local и Specific Version для True):
    • System.Web
    • packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll *
    • packages\Microsoft.AspNet.Razor.2.0.20715.0\lib\net40\System.Web.Razor.dll *
    • packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.dll *
    • packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Deployment.dll *
    • packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll *
  • Следующие импорт не по умолчанию:
    • System.Web
    • System.Web.Mvc
    • System.Web.Mvc.Html
  • Следующие файлы/структура проекта:
    • Controllers папка, содержащая CustomUIController.vb
    • Models папка, содержащая CustomUIModel.vb
    • Views, содержащая папку CustomUI, содержащую Index.vbhtml
  • Web.config в папке "Представления". См. Ниже содержание.
  • packages.config файл в корне проекта. См. Ниже содержание.

Содержимое моих файлов выглядит следующим образом:

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=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.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=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Html" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

</configuration>

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Razor" version="2.0.20715.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.20710.0" targetFramework="net40" />
</packages>

CustomUIController.vb

Imports System.Web.Mvc

Public Class CustomUIController
   Inherits Controller

   Public Function Index() As ActionResult
      Return View()
   End Function
End Class

CustomUIModel.vb

Public Class CustomUIModel
   Public Property Name As String
   Public Property Value As Decimal
End Class

Index.vbhtml

@ModelType CustomTemplate.CustomUIModel

@Html.LabelFor(Function(m) m.Name)

В этот момент я могу работать с Intellisense, помогая мне в представлениях .vbhtml и классах .vb, создавая проект, а затем копирует только представления в папку, развернутую в основном приложении Views (в соответствующей подкатегории, каталог) и основной DLL проекта для основного развертываемого приложения bin (зависимые файлы DLL уже есть).

Edit:

После выполнения процесса в другой системе, чтобы его проверить и как он работает для .NET 4.5 и VS 2013, я заметил следующее:

  • Я думаю, что я забыл упомянуть, что ссылка на System.Web.DynamicData может быть удалена.
  • В VS 2013 и/или .NET 4.5 некоторые версии изменяются:
    • пакеты \Microsoft.AspNet.Mvc.4.0.30506.0\Lib\net40\System.Web.Mvc.dll
    • пакеты \Microsoft.AspNet.Razor.2.0.30506.0\Lib\net40\System.Web.Razor.dll
    • пакеты \Microsoft.AspNet.WebPages.2.0.30506.0\Lib\net40\System.Web.WebPages.dll
    • пакеты \Microsoft.AspNet.WebPages.2.0.30506.0\Lib\net40\System.Web.WebPages.Deployment.dll
    • пакеты \Microsoft.AspNet.WebPages.2.0.30506.0\Lib\net40\System.Web.WebPages.Razor.dll
  • Я не знаю, насколько я достаточно убедился в этом, но ссылки на частные (Copy Local) DLL файлы должны быть установлены на "Копировать локальную" и/или должны использовать версию, представленную в пакетов при создании проекта из шаблона MVC4. Я не знаю почему, но стандартные версии .NET(не частные), похоже, не работают, насколько это касается Intellisense.
  • Лучший способ проверить, все ли по-прежнему "ОК", насколько это касается IDE, заключается в закрытии решения, удалении папок bin и obj в выводе пользовательского проекта, повторной загрузке решения, курсор на LabelFor в файле Index.vbhtml и нажмите клавишу F12, чтобы увидеть, переносит ли она вас в Обозреватель объектов.

Из-за новых версий файл пакетов отличается:

Packages.config

<packages>
  <package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net45" />
</packages>

Ответ 4

Хорошо, это длинный снимок, но я столкнулся с той же проблемой. Вы используете JetBrains Resharper?

Resharper переопределяет VS intellisense engine, но не понимает синтаксис Razor. Вам просто нужно сказать VS, чтобы полагаться на свой собственный intellisense, а не на Resharper's.

В VS2010 перейдите в Resharper - Options - Intellisense - General. Затем проверьте переключатель Visual Studio.

Работал отлично для меня.

Ответ 5

Ни одно из решений, которое я мог бы найти в Интернете или на SO, не исправил это для меня.

Может показаться, что кувалдой взломать орех, но я создал проект приложения MVC 4 вместо библиотеки классов и вырвал все, что мне не нужно. Intellisense и @model работают нормально.