基于Razor的视图不会看到引用的程序集

时间:2011-02-10 04:18:23

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

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

@model MyClasses.MyModel

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

标准视图引擎中引用的同一个类可以正常工作。我在尝试在我的视图中引用该类时遇到同样的问题。

我是否遗漏了一些关于Razor的内容,或者我是否需要以其他方式引用该程序集?

20 个答案:

答案 0 :(得分:104)

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

打开web.config文件夹中的Views文件,并确保其中包含以下内容:

<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以应用更改。

答案 1 :(得分:54)

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

  • 复制本地选项设置为true。
  • 在Razor视图中添加“using ...”语句是没用的
  • 将命名空间添加到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>

暂时省略版本,文化,令牌,但将来应该修复。

答案 2 :(得分:18)

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

答案 3 :(得分:12)

以上都不适合我;

  • Dlls设置为Copy Local
  • 向web.configs添加名称空间都没有做任何事情
  • 添加对system.web \ compilation \ assemblies的程序集引用也没有帮助(虽然我没有删除这些引用,因此可能也需要它们)。

但我终于找到了对我有用的东西:

这是因为我将构建输出转到bin \ Debug \ for Debug配置和bin \ Release \ for Release configuations。一旦我将Build Configuation更改为&#34; bin \&#34;对于所有配置(如下图所示),一切都开始正常工作!!!

Build Configuration

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

  

无法加载文件或程序集&System; Web.Helpers,Version = 3.0.0.0,   Culture = neutral,PublicKeyToken = 31bf3856ad364e35&#39;或其中一个   依赖。系统找不到指定的文件。

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

答案 4 :(得分:6)

您似乎在寻找这个答案: 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多年来变得越来越困难,因此可能需要关闭运行Debug构建的Razor文件,然后重新打开Razor文件,或者最糟糕的是需要重新启动Visual Studio。但最终它会向您呈现Razor文件,就好像该命名空间列表中的所有内容都位于所有视图顶部的@using语句中一样。

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

<强> _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>

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

...\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中有两个版本。视图web.config引用了v1,但应用程序引用了v2。删除引用的程序集并重新添加v1。 System.Web.WebPages.Razor等等。

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:1)

好吧,对我而言,情况有所不同。我错过了使用MVC项目组装我的控制台应用程序项目。所以,添加参考是不够的。

这可能对其他人有所帮助。转到root web.config文件system.web - &gt; compilation - &gt;像这样添加你的项目参考。

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

在我的情况下,我尝试使用的包引用了.net standard 2.1,而我的剃刀类库项目设置为2.0

答案 13 :(得分:0)

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

示例:如果您创建一个新的Application并且它获得默认名称Webapplicaiton1,那么将创建此命名空间。所以,让我们说你不想拥有这个命名空间,所以从VS你可以看到任何地方你可以看到&#34; MyNamespace&#34;。您还可以搜索并替换来自&#34; Webapplication1&#34;的所有代码。并用&#34; MyNamespace&#34;替换它。 这也改变了web.config文件,使其包含在内

现在一切都会有效,除了Razor观点。

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

我已经通过将我的文件复制到一个新的解决方案中进行了彻底的测试,唯一的区别是foldername。

答案 14 :(得分:0)

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

我编辑了视图页面并复制了内容并粘贴在其​​中,我没有更改视图的任何内容,只是编辑了所以视觉工作室可以做跟踪页面的事情,然后每件事情开始工作

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

答案 15 :(得分:0)

在spacename模型中,yourClassModel,在名称类

之前添加public
public class yourClassModel{
    prop
}

答案 16 :(得分:0)

除了对<assemblies><namespaces>进行web.config更改之外,我发现GAC的大会有很大的不同。您可以像在全球注册的任何核心.NET程序集一样应用区域性和公钥标记。

有人可能会在提及GAC时感到不寒而栗。但作为一名BizTalk开发人员,我已经成长为拥抱它。

答案 17 :(得分:0)

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

答案 18 :(得分:0)

包含整个命名空间

@model namespace.myclasses.mymodel

答案 19 :(得分:0)

尝试将MyClasses所在的命名空间添加到

下的web.config中

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