需要razor视图引擎自动完成才能在类库中工作?

Jar*_*ttV 47 asp.net-mvc intellisense autocomplete razor asp.net-mvc-3

我们有一个模块化的架构,我们在一个单独的项目(类库)中有一些视图(cshtml)文件.我们怎样才能得到语法高亮和 当项目不是MVC项目时,自动完成工作?

请注意,类库包含控制器,视图,模型等.它只是没有正常mvc项目所具有的web.config,global.asax等.

除了如此重要的模型之外,intellisense适用于所有事物: 模型错误的屏幕截图

使用MVC3 RTM,如果将鼠标悬停在模型上,您现在可以获得更好的错误消息:

C:\ ...\Index.cshtml:ASP.NET运行时错误:没有为扩展名".cshtml"注册的构建提供程序.您可以在machine.config或web.config中的<compilation> <buildProviders>部分注册一个.确保具有BuildProviderAppliesToAttribute属性,该属性包含值"Web"或"全部".

所以我补充说:

<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>
Run Code Online (Sandbox Code Playgroud)

然后在添加构建提供程序后,将显示以下错误消息:

C:\ ...\Index.cshtml:ASP.NET运行时错误:无法加载文件或程序集"System.Web.WebPages.Razor"或其依赖项之一.该系统找不到指定的文件.(C:\ ...\machine.config第259行)

Dee*_*pak 49

这篇文章的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>
Run Code Online (Sandbox Code Playgroud)


Oma*_*mar 12

对于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>
Run Code Online (Sandbox Code Playgroud)


Blu*_*kMN 6

我遵循了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.configWeb.Release.config文件.(不要删除Web.config从浏览文件夹.)
  4. Web.configViews文件夹中的文件中删除以下部分:
    • appSettings
    • system.web
    • system.webServer
    • 您也可以删除行<add namespace="System.Web.Mvc.Ajax" /><add namespace="System.Web.Routing" />
  5. 从项目中删除以下引用(*已加星标的引用是进入packages目录并具有Copy LocalSpecific 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:
    • <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"/>
  8. 从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

这让我有以下几点:

  1. 一个针对.NET Framework 4的VB.Net类库项目(虽然我原本打算将其设为4.5 - 我认为其中有效).
  2. 以下非默认.NET引用(已加星标的引用必须具有Copy LocalSpecific 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*
  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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

CustomUIController.vb

Imports System.Web.Mvc

Public Class CustomUIController
   Inherits Controller

   Public Function Index() As ActionResult
      Return View()
   End Function
End Class
Run Code Online (Sandbox Code Playgroud)

CustomUIModel.vb

Public Class CustomUIModel
   Public Property Name As String
   Public Property Value As Decimal
End Class
Run Code Online (Sandbox Code Playgroud)

Index.vbhtml

@ModelType CustomTemplate.CustomUIModel

@Html.LabelFor(Function(m) m.Name)
Run Code Online (Sandbox Code Playgroud)

在这一点上,我能够使用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程序
    • 包\ 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
  3. 我不知道如果我做了它上面一个足够强大的点,但私人(复制本地)的DLL的引用必须设置复制本地和/或必须使用在包文件夹时提供的版本从MVC4模板创建项目.我不知道为什么,但.NET标准版本(非私有)似乎不起作用,至少Intellisense至关重要.
  4. 检查,如果事情仍是最好的办法"OK"至于IDE而言是关闭的解决方案,删除binobj文件夹,自定义项目的输出,重新加载的解决方案,将光标放在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>
Run Code Online (Sandbox Code Playgroud)