需要razor视图引擎自动完成在类库中工作?
我们有一个模块化的架构,我们在一个单独的项目(类库)中有一些视图(cshtml)文件。 我们怎么能得到的 语法突出和 自动完成工作,当项目不是一个MVC项目?
请注意,类库有控制器,视图,模型等。它只是没有web.config,global.asax等,一个正常的mvc项目会有。
intellisense适用于一切,只是如此重要的模式:
使用MVC3 RTM,如果将鼠标hover在模型上,现在可以获得更好的错误消息:
C:\ … \ Index.cshtml:ASP.NET运行时错误:没有为扩展名“.cshtml”注册构build提供程序。 您可以在machine.config或web.config的<compilation> <buildProviders>部分注册一个。 确保具有包含值“Web”或“全部”的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>
然后在添加构build提供程序后,出现此错误消息:
C:\ … \ Index.cshtml:ASP.NET运行时错误:无法加载文件或程序集“System.Web.WebPages.Razor”或其依赖项之一。 该系统找不到指定的文件。 (C:\ … \ machine.config行259)
从这个职位的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的build议,并且logging了我所认为的最小的一组操作,以便使项目适合用作ASP.NET MVC4类库项目。 这是在Visual Studio 2012 Update 4中完成的,目标是VB.Net。 如果我有机会,我可能会在以后包含在Visual Studio 2013中做类似的文档。 以下是我采取的行动:
- 创build一个新的空白MVC4项目与解决scheme的一个单独的目录(所以你可以清楚地看到具有更新版本的参考文件的
packages
目录是项目的一部分)。 - 添加一个虚拟控制器,视图和模型来testing它(这需要在构build类库之后将输出DLL和视图复制到另一个Web应用程序)。
- 从项目中删除以下文件:
- 整个
App_Start
文件夹 - 整个
App_Data
文件夹和任何其他空文件夹(我的Mercurial历史没有使这个可见,所以我要从内存中)。 -
Global.asax
-
Global.asax.vb
-
Web.config
文件中的根和相关的Web.Debug.config
和Web.Release.config
文件。 (不要从Views文件夹中删除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”/>
- 从packages文件夹中删除以下子目录:
- 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
这给我留下如下:
- 一个面向.NET Framework 4的VB.Net类库项目(尽pipe我打算将其设置为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
- 以下项目文件/结构:
- 包含
CustomUIController.vb
Controllers
文件夹 - 包含
CustomUIModel.vb
Models
文件夹 - 包含
CustomUI
文件夹的Views
文件夹,包含Index.vbhtml
- 包含
- 在Views文件夹中的
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文件已经存在)。
编辑:
在另一个系统上跟踪这个过程来validation它,以及它是如何工作的.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
- 我不知道我是否足够强调它,但是私有(复制本地)DLL的引用必须设置为复制本地,和/或必须使用packages文件夹中提供的版本从MVC4模板创build一个项目。 我不知道为什么,但至less对于Intellisense而言,.NET标准版本(非私有的)似乎不起作用。
- 就IDE而言,检查是否仍然“OK”的最好方法是closures解决scheme,删除自定义项目输出中的
bin
和obj
文件夹,重新加载解决scheme,将光标置于LabelFor
.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>
好吧,这是一个很大的问题,但我遇到了同样的问题。 你使用JetBrains Resharper吗?
Resharper重写了VS的intellisense引擎,但它并不理解Razor的语法。 你只需告诉VS依靠自己的intellisense而不是resharper's。
在VS2010中,使用Resharper – Options – Intellisense – General。 然后检查Visual Studio单选button。
为我工作很好。
我在网上find的解决scheme都没有解决这个问题。
可能看起来像一个大锤破解螺母,但我创build了一个MVC 4应用程序项目,而不是一个类库,撕掉了一切我不需要。 智能感知和@model
工作正常。