独立したプロジェクト(クラスライブラリ)にいくつかのビュー(cshtml)ファイルがあるモジュラーアーキテクチャがあります。どうすれば入手できますか 構文の強調表示と プロジェクトがMVCプロジェクトではない場合に機能するオートコンプリート?
クラスライブラリには、コントローラ、ビュー、モデルなどがあることに注意してください。通常のmvcプロジェクトにあるweb.config、global.asaxなどはありません。
インテリセンスは、非常に重要なモデルを除くすべてに有効です:
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)
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>
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>
Jammerの提案に従い、ASP.NET MVC4クラスライブラリプロジェクトとして機能するのに適したプロジェクトを取得するための最小限のアクションセットであると信じていることを文書化しています。これはVisual Studio 2012 Update 4で行われ、VB.Netを対象としていました。機会があればVisual Studio 2013で同様のことを行うためのドキュメントを後で含めることができます。私が行ったアクションは次のとおりです。
packages
ディレクトリがプロジェクトの一部であることが明確にわかります)。App_Start
フォルダー全体App_Data
フォルダー全体とその他の空のフォルダー(私のMercurialの履歴ではこれが表示されなかったため、メモリから移動します)。Global.asax
Global.asax.vb
Web.config
ファイルと、依存するWeb.Debug.config
およびWeb.Release.config
ファイル。 (Do not ViewsフォルダーからWeb.config
を削除します。)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
:から次を削除します。これにより、次のことがわかります。
Copy Local
およびSpecific Version
をTrue
に設定する必要があります):CustomUIController.vb
を含むControllers
フォルダーCustomUIModel.vb
を含むModels
フォルダーViews
フォルダーを含むCustomUI
フォルダー、Index.vbhtml
を含むWeb.config
ファイル。内容については以下をご覧ください。packages.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>
<?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>
Imports System.Web.Mvc
Public Class CustomUIController
Inherits Controller
Public Function Index() As ActionResult
Return View()
End Function
End Class
Public Class CustomUIModel
Public Property Name As String
Public Property Value As Decimal
End Class
@ModelType CustomTemplate.CustomUIModel
@Html.LabelFor(Function(m) m.Name)
この時点で、IntelliSenseを使用して.vbhtmlビューと.vbクラスを支援し、プロジェクトをビルドしてから、ビューだけをプライマリアプリケーションのデプロイされたViews
フォルダー(適切なサブディレクトリ)、およびプロジェクトのプライマリ出力DLLプライマリアプリケーションのデプロイされたbin
ディレクトリへ(依存するDLLファイルは既に存在します)。
編集:
別のシステムでプロセスを検証して検証し、.NET 4.5およびVS 2013でどのように機能するかを確認したところ、次のことに気付きました。
System.Web.DynamicData
への参照を削除できることを言及するのを怠ったと思います。bin
およびobj
フォルダを削除することです。カスタムプロジェクトの出力、ソリューションの再読み込み、Index.vbhtmlファイルのLabelFor
にカーソルを置き、F12キーを押して、オブジェクトブラウザーに移動するかどうかを確認します。新しいバージョンのため、パッケージファイルは異なります。
<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>
オンラインまたはSOでこれを修正した解決策は見つかりませんでした。
ナッツを割るのは大したことのように思えるかもしれませんが、クラスライブラリの代わりにMVC 4アプリケーションプロジェクトを作成し、不要なものをすべて削除しました。インテリセンスと@model
正常に動作しています。