Нужно автоматическое заполнение бритвенного представления для работы в библиотеке классов? - PullRequest
47 голосов
/ 11 ноября 2010

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

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

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

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

C: \ ... \ Index.cshtml: ошибка времени выполнения ASP.NET: не зарегистрирован ни один поставщик сборки длярасширение ".cshtml".Вы можете зарегистрировать его в разделе в machine.config или web.config.Убедитесь, что у него есть атрибут BuildProviderAppliesToAttribute, который включает значение «Web» или «All».

Итак, я добавил это:

<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)

Ответы [ 5 ]

49 голосов
/ 21 января 2011

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>
12 голосов
/ 14 июня 2013

Для 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>
6 голосов
/ 14 января 2014

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

  1. Создайте новый пустой проект MVC4 с отдельным каталогом для решения (чтобы вы могли четко видеть, что каталог packages с обновленными версиями справочных файлов является частью проекта).
  2. Добавьте фиктивный контроллер, представление и модель для его тестирования (что повлекло за собой копирование выходной DLL и представление в другое веб-приложение после создания библиотеки классов).
  3. Удалить из проекта следующие файлы:
    • Вся App_Start папка
    • Вся папка App_Data и любые другие пустые папки (моя история Mercurial не делала это видимым, поэтому я ухожу из памяти).
    • Global.asax
    • Global.asax.vb
    • Файл Web.config в корневом и зависимых файлах Web.Debug.config и Web.Release.config. (Не , а удалите Web.config из папки Views.)
  4. Удалите следующие разделы из файла Web.config в папке Views:
    • appSettings
    • system.web
    • system.webServer
    • Вы также можете удалить строки <add namespace="System.Web.Mvc.Ajax" /> и <add namespace="System.Web.Routing" />
  5. Удалите следующие ссылки из проекта (* помеченные ссылки были ссылками для конкретной версии, которые помещались в каталог 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) *
  6. Удалите следующие Импорты для всего проекта из настроек проекта:
    • 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
  7. Удалить из packages.config следующее:
  8. Удалите следующие подкаталоги из папки пакетов:
    • 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

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

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

Редактировать:

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

  1. Мне кажется, я не упомянул, что ссылка на System.Web.DynamicData может быть удалена.
  2. В VS 2013 и / или.NET 4.5, некоторые версии меняются:
    • пакеты \ Microsoft.AspNet.Mvc.4.0.30506.0 \ lib \ net40 \ System.Web.Mvc.dll
    • packages \ 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
    • packages \ Microsoft.AspNet.WebPages.2.0.30506.0 \ lib \ net40 \ System.Web.WebPages.Razor.dll
  3. Я не знаю, изложил ли я это достаточно убедительно, но ссылки на частные (Copy Local) библиотеки DLL do должны быть установлены на Copy Local и / или * необходимо использовать версию, указанную в папке пакетов, при создании проекта из шаблона MVC4.Я не знаю почему, но стандартные версии .NET (не частные), кажется, не работают, поскольку Intellisense, по крайней мере, заинтересован.
  4. Лучший способ проверить, все ли по-прежнему "ОК«что касается среды 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 голосов
/ 14 января 2011

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

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

В VS2010, перейдите Resharper - Опции - Intellisense - Общие.Затем проверьте переключатель Visual Studio.

Отлично сработало для меня.

3 голосов
/ 07 ноября 2012

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

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

...