【问题标题】:Razor-based view doesn't see referenced assemblies基于 Razor 的视图看不到引用的程序集
【发布时间】:2011-06-24 14:39:51
【问题描述】:

我正在尝试基于来自另一个程序集的类创建强类型视图。不管出于何种原因,我的 Razor 视图似乎对我的项目中引用的其他程序集没有任何可见性。例如

@model MyClasses.MyModel

导致 Visual Studio 2010 中出现错误“找不到类型或命名空间名称 MyClasses(您是否缺少 using 指令或程序集引用?)。”

标准视图引擎中引用的相同类可以正常工作。我在尝试在视图主体中引用该类时遇到了同样的麻烦。

我是否遗漏了有关 Razor 的某些内容,还是需要以其他方式引用程序集?

【问题讨论】:

  • 你在使用整个命名空间吗? @model namespace.myclasses.mymodel,也许?

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


【解决方案1】:

有一个新的配置部分用于引用 Razor 视图的命名空间。

打开Views 文件夹中的web.config 文件,并确保它具有以下内容:

<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" />
                <add namespace="SquishIt.Framework" />
                <add namespace="Your.Namespace.Etc" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>
</configuration>

或者,您可以将 using 语句添加到共享布局中:

@using Your.Namespace.Etc;
<!DOCTYPE html>
<head>
....

编辑 Web.config 后,重新启动 Visual Studio 以应用更改。

【讨论】:

  • 这可行,但请确保您的程序集被 Copy Local = true 引用。否则,外部程序集可能无法正常工作。
  • 这里应该注意的是,如果您使用来自“虚拟”源(例如数据库)的视图而不是使用真实视图文件,则必须将其放在 ROOT web.config 文件中视图中的代码可以工作。
  • @Terry,看来 Copy local = true 即使对于某些系统根命名空间程序集也是必要的。
  • 我的程序集是在运行时加载的,所以我不能使用 web.config 文件来添加它们。还有什么我可以尝试的吗?有没有办法用他们自己的 web.config 文件导入我的外部视图?这很奇怪,因为我在与视图相同的程序集中引用命名空间。
  • 不需要重新启动 Visual Studio。只需关闭并重新打开视图就足够了。
【解决方案2】:

尝试将 MyClasses 所在的命名空间添加到 web.config 下的

<pages> <namespaces></namespaces> </pages>

【讨论】:

    【解决方案3】:

    包括整个命名空间

    @model namespace.myclasses.mymodel
    

    【讨论】:

      【解决方案4】:

      尝试在 Razor 视图中使用 Smo 对象时,我遇到了同样的错误。 显然这是因为 Razor 找不到项目中引用的 DLL。 我通过将所有 Smo dll 的“Copy Local”设置为 true 解决了这个问题,但是可能有更好的解决方案(请参阅上面的 Czechdude 链接) @using 和 web.config 编辑是无用的,因为只有当您希望从类型名称中省略命名空间部分时才需要它们(例如 Server 而不是 Microsoft.SqlServer.Management.Smo.Server)

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题:MVC3 项目 MyCore.Web 正在从同一解决方案中的另一个项目引用 MyCore.DBLayer 命名空间(程序集名称为 MyCoreDBLayer)。 MyCore.DBLayer 中的所有对象在控制器和模型中都能完美运行,但在 Razor 视图中失败,并出现错误 '名称空间“MyCore”中不存在类型或名称空间名称“DBLayer”(您是否缺少程序集引用?) ' 显然不是这样的。

        • 复制本地选项设置为真。
        • 在 Razor 视图中添加“使用...”语句没有用
        • 向 system.web.webPages.razor 部分添加命名空间也没有用

        将程序集引用添加到根 web.config 文件的 system.web/compilation/assemblies 部分修复了该问题。该部分现在看起来像:

        <system.web>
            <compilation debug="true" targetFramework="4.0">
              <assemblies>
                <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                **<add assembly="MyCoreDBLayer" />**
              </assemblies>
            </compilation>
        ...
        </system.web>
        

        现在省略版本、文化、令牌是可以的,但将来应该会修复。

        【讨论】:

        • 此解决方案有效,但这是一个坏主意。当我将我的所有类都设为内部并让 Web 程序集成为 MyCoreDBLayer 的朋友时,它停止了工作。我最终编写了一个公共类作为 MVC 模型,它围绕来自朋友程序集的类。我认为不应在 Razor 视图中使用 MVC 模型命名空间以外的类 - 始终可以编写包装器
        • 这对我有用,我尝试将它添加到 Views/web.config 并且当它被放置在那里时它也有效。
        【解决方案6】:

        这些https://stackoverflow.com/a/7597360/808128 都不适合我。甚至“将程序集引用添加到根 web.config 文件的 system.web/compilation/assemblies 部分”。所以我剩下两种方法:1)为我的程序集添加一个公共包装类,Razor 代码可以通过这个包装访问这个程序集; 2) 只需将程序集逻辑添加到 Razor 代码所在的同一程序集中的公共类中。

        【讨论】:

          【解决方案7】:

          您似乎正在寻找这个答案: https://stackoverflow.com/a/4136773/176877

          即打开内层Views\Web.Config(不是根目录),在Pages标签下添加命名空间:

          <system.web.webPages.razor>
            <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory.../>
            <pages pageBaseType="System.Web.Mvc.WebViewPage">
              <namespaces>
                <add namespace="System.Web.Mvc" />
                ...
                <add namespace="System.Web.Routing" />
                <!-- Your namespace here -->
              </namespaces>
          

          保存,然后关闭并重新打开 Razor 文件。

          如果您使用的是区域,则需要为每个区域中的每个 Web.Config 执行此操作。

          Visual Studio 多年来变得越来越错误,因此它可能需要关闭运行调试版本的 Razor 文件,然后重新打开 Razor 文件,或者在最坏的情况下可能需要重新启动 Visual Studio。但最终它会将 Razor 文件呈现给您,就好像该命名空间列表中的所有内容都在您所有视图顶部的 @using 语句中一样。

          【讨论】:

            【解决方案8】:

            在将我的开发机器从 Win7 32 位移动到 Win7 64 位后,我遇到了类似的错误。错误信息:

            ...\Web\Views\Login.cshtml: ASP.net runtime error: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from System.Web.WebPages.Razor, Version=1.0.0.0 ... Type B originates from ... Version=2.0.0.0

            原来我在 GAC 中有两个版本。 View web.config 引用了 v1,但应用程序引用了 v2。删除了引用的程序集并重新添加了 v1。 System.Web.WebPages.Razor 等。

            【讨论】:

            • +1 thx 这是我的最后一点,现在我可以调试 asp.net mvc 4 hohoho!
            【解决方案9】:

            以上都不适合我;

            • Dll 设置为复制本地
            • 向两个 web.configs 添加命名空间没有任何作用
            • 将程序集引用添加到 system.web\compilation\assemblies 也没有帮助(虽然我没有删除这些引用,所以可能也需要它们)

            但我终于找到了适合我的东西:

            这是因为我的构建输出进入 bin\Debug\ 用于调试配置,而 bin\Release\ 用于发布配置。一旦我将所有配置的构建配置更改为“bin\”(如下图所示),那么一切都开始正常工作了!!!

            我不知道为什么将构建分离到 Release 和 Debug 文件夹会导致 Razor 语法中断,但这似乎是因为找不到程序集。对我来说,有剃刀语法问题的项目实际上是我的“剃刀库”项目。它们被设置为应用程序项目,但是我将它们用作带有 RazorGenerator 的类库来编译我的视图。当我实际尝试直接运行其中一个项目时,会导致以下配置错误:

            无法加载文件或程序集'System.Web.Helpers,版本=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其之一 依赖关系。系统找不到指定的文件。

            这导致我尝试更改构建输出,因为我注意到对于所有 Web 项目,构建输出似乎总是直接到 bin 文件夹,这与具有发布和调试文件夹的类库的默认设置不同。

            【讨论】:

            • 通过方式确认,一旦 dll 直接位于 bin 文件夹中,您就不需要 system.web\compilation\assemblies 部分。这可以回到只是
            • 天哪!经过大量时间寻找解决方案,这终于解决了我在类库项目中的 Razor 视图!非常感谢。
            • 难以置信!我正在将我的视图类库构建到另一个项目的目录中并且遇到了这个问题。构建路径需要为 bin\ 才能正常工作。现在使用 post build xcopy 代替。
            • 我在一个类库项目中使用 Razor 引擎并且遇到了同样的问题。将输出路径设置为“bin\”也为我解决了这个问题。像 GlacialSpoon 一样,我在构建后步骤中将程序集复制到正确的输出文件夹。不是最好的方法,但至少 Intellisense、引用程序集和语法高亮是有效的。
            • 值得注意的是,如果您的自定义输出目录指向 parent 目录 ala '..\some\dir\',则会出现原始问题。但是,如果您将输出目录更改为“some\dir\”,那么一切正常。这肯定是矩阵中的一个恶魔般的故障。
            【解决方案10】:

            除了为&lt;assemblies&gt;&lt;namespaces&gt; 更改web.config 之外,我发现GAC 对程序集进行了很大的更改。您可以像在全球注册的任何核心 .NET 程序集一样应用文化和公钥令牌。

            提到 GAC,有些人可能会不寒而栗。但作为一名 BizTalk 开发人员,我已经开始接受它。

            【讨论】:

              【解决方案11】:

              在我的例子中,包含命名空间的单独项目是一个控制台应用程序。将其更改为类库可以解决问题。

              【讨论】:

              • 这为我解决了。首先,我尝试制作类库(包),但在引用我需要的 nuget 包时遇到了问题。最好不要花哨,只做一个基本的类库(DLL)
              【解决方案12】:

              在空间名称模型中,yourClassModel,在名称类之前添加 public

              public class yourClassModel{
                  prop
              }
              

              【讨论】:

                【解决方案13】:

                这个解决方案对我有用(这很有趣,但很有效)

                我编辑了视图页面并复制了内容并粘贴在其​​中,我没有更改视图的任何内容,但只是进行了编辑,以便视觉工作室可以跟踪页面,然后一切都开始工作

                解决方案 - 只需编辑页面并替换为相同的页面(为我工作)

                【讨论】:

                  【解决方案14】:

                  ASP.NET Core MVC 中,解决方案是在 _ViewImports.cshtml 中添加 using,而不是在使用 ASP.NET MVC 5 时将其 web.config 放在 View 文件夹中。

                  _ViewImports.cshtml

                  @using mySolution
                  @using mySolution.ViewModels // <-- Add this, and place your ViewModel (e.g. LoginViewModel) in here.
                  @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
                  

                  查看

                  @model LoginViewModel // Add to _ViewImports to make this line work
                  <div>This is the View for the login screen.</div>
                  

                  【讨论】:

                    【解决方案15】:

                    嗯,对我来说是不同的。我缺少使用 MVC 项目组装我的控制台应用程序项目。因此,添加参考是不够的。

                    这可能对其他人有所帮助。转到根 web.config 文件 system.web -> compilation -> 像这样添加您的项目引用。

                    <assemblies> <add assembly="Your.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </assemblies>

                    【讨论】:

                      【解决方案16】:

                      我也有同样的问题,但问题出在程序集的目标框架

                      引用的程序集位于项目已设置为 .NET Framework 4.5 的 .NET Framework 4.6 中。

                      希望这对搞砸框架的人有所帮助。

                      【讨论】:

                        【解决方案17】:

                        您的项目文件夹名称必须相同。如果您的项目或解决方案名称不同,那么 MVC 会伤害您。

                        示例:如果您创建一个新的应用程序并获得默认名称 Webapplicaiton1,则将创建此命名空间。所以,让我们说你不想拥有这个命名空间,所以从 VS 中你可以随处看到“MyNamespace”。您还可以搜索并替换“Webapplication1”中的所有代码,并将其替换为“MyNamespace”。 这也会更改 web.config 文件,使其包含

                        现在一切正常,除了 Razor 视图。

                        RazorViews 找不到它,因为项目的 FOLDERNAME 存在某种奇怪的依赖关系。这是糟糕的设计。

                        我通过将我的文件复制到一个新的解决方案中对此进行了半彻底的测试,唯一的区别是文件夹名称。

                        【讨论】:

                        • 这真是太可笑了!我已将项目文件夹名称重命名为正确的名称,并在文本文件中打开了解决方案并更正了文件夹描述!有效!我正在使用 Visual Studio 2019
                        【解决方案18】:

                        对我来说,我引用的项目是一个控制台应用程序。它被设置为构建为 exe(控制台应用程序)而不是类库 (DLL)。当我改变这个时,我能够看到来自那个单独项目的模型没问题。

                        【讨论】:

                        • 感谢@user1619480,我遇到了同样的问题,在我的情况下,我使用 VS 2017 添加了一个 .Net Framework 类库,出于某种原因,输出类型是控制台应用程序。
                        【解决方案19】:

                        在我的例子中,我尝试使用的包引用了 .net 标准 2.1,而我的 razor 类库项目设置为 2.0

                        【讨论】:

                          【解决方案20】:

                          就我而言,我在 Web 应用程序之外使用 Razor 视图。
                          在解决方案中将 dll 复制到我的 bin 文件夹即可解决问题。

                          【讨论】:

                            猜你喜欢
                            • 2017-08-20
                            • 1970-01-01
                            • 2017-10-15
                            • 2010-11-09
                            • 1970-01-01
                            • 2012-08-16
                            • 2017-03-18
                            • 2012-08-24
                            • 1970-01-01
                            相关资源
                            最近更新 更多