web-dev-qa-db-ja.com

クラスライブラリで動作するために、カミソリビューエンジンのオートコンプリートが必要ですか?

独立したプロジェクト(クラスライブラリ)にいくつかのビュー(cshtml)ファイルがあるモジュラーアーキテクチャがあります。どうすれば入手できますか 構文の強調表示と プロジェクトがMVCプロジェクトではない場合に機能するオートコンプリート?

クラスライブラリには、コントローラ、ビュー、モデルなどがあることに注意してください。通常のmvcプロジェクトにあるweb.config、global.asaxなどはありません。

インテリセンスは、非常に重要なモデルを除くすべてに有効です: screenshot of model error

MVC3 RTMでは、モデルにカーソルを合わせると、より良いエラーメッセージを取得できるようになりました。

C:\ ...\Index.cshtml:ASP.NETランタイムエラー:拡張子 '.cshtml'に登録されているビルドプロバイダーがありません。 machine.configまたはweb.configの<compilation> <buildProviders>セクションで登録できます。値 'Web'または 'All'を含む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'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。 (C:\ ...\machine.config行259)

47
JarrettV

this post の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>
49
Deepak

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>
12
Omar

Jammerの提案に従い、ASP.NET MVC4クラスライブラリプロジェクトとして機能するのに適したプロジェクトを取得するための最小限のアクションセットであると信じていることを文書化しています。これはVisual Studio 2012 Update 4で行われ、VB.Netを対象としていました。機会があればVisual Studio 2013で同様のことを行うためのドキュメントを後で含めることができます。私が行ったアクションは次のとおりです。

  1. ソリューション用の別のディレクトリを使用して、新しい空のMVC4プロジェクトを作成します(参照ファイルの更新バージョンを含むpackagesディレクトリがプロジェクトの一部であることが明確にわかります)。
  2. ダミーのコントローラー、ビュー、およびモデルを追加してテストします(クラスライブラリをビルドした後、出力DLLおよびビューを別のWebアプリケーションにコピーする必要がありました)。
  3. プロジェクトから次のファイルを削除します。
    • App_Startフォルダー全体
    • App_Dataフォルダー全体とその他の空のフォルダー(私のMercurialの履歴ではこれが表示されなかったため、メモリから移動します)。
    • Global.asax
    • Global.asax.vb
    • ルートのWeb.configファイルと、依存するWeb.Debug.configおよびWeb.Release.configファイル。 (Do not ViewsフォルダーからWeb.configを削除します。)
  4. ViewsフォルダーのWeb.configファイルから次のセクションを削除します。
    • appSettings
    • system.web
    • system.webServer
    • <add namespace="System.Web.Mvc.Ajax" />および<add namespace="System.Web.Routing" />を削除することもできます
  5. プロジェクトから次の参照を削除します(*スター付き参照は、packagesディレクトリに移動し、Copy LocalおよびSpecific VersionTrueに設定されたバージョン固有の参照です)。
    • 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:から次を削除します。
    • <パッケージ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" />
  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. .NET Framework 4をターゲットとするVB.Netクラスライブラリプロジェクト(これは4.5であることを意図していましたが、どちらでも機能すると思います)。
  2. 次のデフォルト以外の.NET参照(スター付き参照には、Copy LocalおよびSpecific VersionTrueに設定する必要があります):
    • 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 *
  3. 次のデフォルト以外のインポート:
    • System.Web
    • System.Web.Mvc
    • System.Web.Mvc.Html
  4. 次のプロジェクトファイル/構造:
    • CustomUIController.vbを含むControllersフォルダー
    • CustomUIModel.vbを含むModelsフォルダー
    • Viewsフォルダーを含むCustomUIフォルダー、Index.vbhtmlを含む
  5. Viewsフォルダー内のWeb.configファイル。内容については以下をご覧ください。
  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では、一部のバージョンが変更されます:
    • packages\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
    • packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll
    • packages\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. 上記の十分な強さを指摘したかどうかはわかりませんが、プライベート(コピーローカル)DLLdoへの参照を設定する必要がありますローカルのコピー、および/またはdoは、MVC4テンプレートからプロジェクトを作成するときにパッケージフォルダーで提供されるバージョンを使用する必要があります。理由はわかりませんが、少なくともIntellisenseに関する限り、.NET標準バージョン(非プライベート)は機能していないようです。
  4. IDEに関する限り、物事がまだ「OK」であるかどうかを確認する最良の方法は、ソリューションを閉じ、以下のbinおよびobjフォルダを削除することです。カスタムプロジェクトの出力、ソリューションの再読み込み、Index.vbhtmlファイルのLabelForにカーソルを置き、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>
6
BlueMonkMN

オンラインまたはSOでこれを修正した解決策は見つかりませんでした。

ナッツを割るのは大したことのように思えるかもしれませんが、クラスライブラリの代わりにMVC 4アプリケーションプロジェクトを作成し、不要なものをすべて削除しました。インテリセンスと@model正常に動作しています。

3
Jammer