【问题标题】:Need razor view engine auto-complete to work in a class library?需要剃刀视图引擎自动完成才能在类库中工作?
【发布时间】:2011-05-08 16:45:30
【问题描述】:

我们有一个模块化架构,其中我们在一个单独的项目(类库)中有一些视图 (cshtml) 文件。当项目不是 MVC 项目时,我们如何让 语法高亮和 自动完成功能起作用?

请注意,类库有控制器、视图、模型等。它只是没有普通 mvc 项目应该有的 web.config、global.asax 等。

智能感知适用于除如此重要的模型之外的所有应用:

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

C:\...\Index.cshtml:ASP.NET 运行时 错误:没有构建提供程序 注册了扩展 '.cshtml'。您可以在 machine.config 中的部分或 网络配置。确保有一个 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 provider之后,出现这个错误信息:

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

【问题讨论】:

  • 您是否检查了打开方式对话框以确保它使用 Razor 编辑器?我创建了一个控制台应用程序,添加了一个 cshtml 文件和语法高亮工作。 Intellisense 似乎不适用于本地类文件,但它似乎适用于全局引用,例如 system.
  • 同样的问题。将 Web.config 放在 View 目录中(从任何新的 MVC3 RC 项目复制)也有帮助。但这不是 100%。 IntelliSence 看不到我的自定义类型。
  • 是的,语法高亮有效,但智能感知无效。
  • 好的,我玩了一会儿,发现如果你想访问任何本地对象(你的库中的类),它们必须设置为 public 才能显示 Intellisense。试一试,看看是否可行。否则,默认的 ClassLibrary 似乎具有智能感知功能。
  • 现在 MVC3 RTM 产品提供了更好的错误消息。我已经在上面添加了。

标签: asp.net-mvc asp.net-mvc-3 razor autocomplete intellisense


【解决方案1】:

对于 Visual Studio 2012/ASP.NET MVC 4,您需要更新程序集版本并将 &lt;add key="webpages:Version" value="2.0.0.0" /&gt; 添加到 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>

【讨论】:

  • 这为我解决了问题。我相信区别在于 system.web.compilation 元素下的程序集。
【解决方案2】:

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>

【讨论】:

  • 确保将它添加到项目的根目录,即使没有引用所有这些程序集,它也能正常工作。
  • 这很好,谢谢。也许这很明显,但经过一些试验和错误后,我意识到配置必须命名为 Web.config,而不是 App.config
  • 此配置允许识别@model 指令(VB.Net 中的@ModelType),但我遇到的下一个问题是@Html 不能解析为WebViewPage(Of TModel).Html As System.Web.HtmlHelper(Of TModel),但是而是在 VB.Net 中对 System.Web.Mvc.HtmlSystem.Web.WebPages.Html 进行了模棱两可的引用。
【解决方案3】:

我已遵循 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 文件。 (不要不要从 Views 文件夹中删除 Web.config。)
  4. 从 Views 文件夹中的 Web.config 文件中删除以下部分:
    • appSettings
    • system.web
    • system.webServer
    • 您也可以删除行&lt;add namespace="System.Web.Mvc.Ajax" /&gt;&lt;add namespace="System.Web.Routing" /&gt;
  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 中删除以下内容:
  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 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>

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

索引.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. 我不知道我是否在上面做了足够的强调,但是对私有(复制本地)DLL 的引用确实必须设置为复制本地和/或 do 从 MVC4 模板创建项目时,必须使用 packages 文件夹中提供的版本。我不知道为什么,但至少就 Intellisense 而言,.NET 标准版本(非私有)似乎不起作用。
  4. 就 IDE 而言,检查事情是否仍然“正常”的最佳方法是关闭解决方案,删除自定义项目输出中的 binobj 文件夹,重新加载解决方案,将将光标放在 Index.vbhtml 文件中的 LabelFor 上,然后按 F12 键查看它是否会将您带到对象浏览器。

因为新版本,packages文件不同:

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】:

    我在网上或 SO 上找到的解决方案都没有为我解决这个问题。

    可能看起来像一把大锤来破解坚果,但我创建了一个 MVC 4 应用程序项目而不是一个类库,并删除了我不需要的所有内容。 Intellisense 和 @model 工作正常。

    【讨论】:

      【解决方案5】:

      好的,这是一个很长的问题,但我遇到了同样的问题。您在使用 JetBrains Resharper 吗?

      Resharper 覆盖了 VS 的智能感知引擎,但它不理解 Razor 语法。你只需要告诉 VS 依赖它自己的智能感知而不是 Resharper 的智能感知。

      在 VS2010 中,转到 Resharper - 选项 - Intellisense - 常规。然后检查 Visual Studio 单选按钮。

      对我来说效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 2011-04-07
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多