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

我试图创build一个基于另一个程序集的类的强types的视图。 不pipe出于什么原因,我的Razor视图似乎没有任何其他程序集在​​我的项目上引用的可见性。 例如

@model MyClasses.MyModel 

导致Visual Studio 2010中出现错误,“无法findtypes或名称空间名称MyClasses (是否缺lessusing指令或程序集引用?”)。

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

我是否缺less关于剃刀的东西,或者我需要以其他方式引用程序集?

有一个新的configuration部分用于引用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 Your.Namespace.Etc; <!DOCTYPE html> <head> .... 

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

我有同样的问题:MVC3项目MyCore.Web引用MyCore.DBLayer命名空间从另一个项目在同一个解决scheme(与程序集名称MyCoreDBLayer)。 来自MyCore.DBLayer的所有对象都在控制器和模型中完美工作,但在Razor视图中失败,错误“名称空间”MyCore“中不存在types或名称空间名称”DBLayer“(是否缺less程序集引用?显然不是这样的。

  • 复制本地选项设置为true。
  • 在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> 

省略版本,文化,标记现在可以,但应该在将来修复。

就我而言,包含名称空间的单独项目是一个控制台应用程序。 将其更改为类库解决了问题。

以上都没有为我工作;

  • Dll被设置为复制本地
  • 向两个web.configs添加命名空间什么也没做
  • 向system.web \ compilation \组件添加程序集引用也没有帮助(虽然我没有删除这些引用,所以也可能是它们也是需要的)

但是我终于find了对我有用的东西:

这是因为我有我的生成输出进入bin \ Debug \debuggingconfiguration和bin \ Release \发布configuration。 只要我将Build Configuation改为“bin”(全部configuration)(如下图所示),一切就开始了!

构建配置

我不知道为什么将你的版本分离到Release和Debug文件夹中应该会导致Razor语法中断,但是这似乎是因为找不到程序集。 对我来说,那些有着razor语法问题的项目实际上是我的“剃刀库”项目。 他们被设置为应用程序项目,但我使用它们作为类库与RazorGenerator编译我的意见。 当我真的试图直接运行这些项目之一时,会导致以下configuration错误:

无法加载文件或程序集“System.Web.Helpers,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”或其某个依赖项。 该系统找不到指定的文件。

这导致我试图改变生成输出,因为我注意到,对于所有的Web项目,生成输出似乎总是直接到bin文件夹,不像默认的类库,它有释放和debugging文件夹。

您似乎正在寻找这个答案: 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> 

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

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

Visual Studio已经变得越来越buggier多年,所以它可能需要closures运行一个debugging生成的Razor文件,然后重新打开Razor文件,或者最糟糕的是可能需要重新启动Visual Studio。 但最终它会向您展示Razor文件,就好像该名称空间列表中的所有内容都位于所有视图顶部的@using语句中一样。

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

_ViewImports.cshtml

 @using mySolution @using mySolution.ViewModels // <-- Add this, and place your ViewModel (eg 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> 

在试图在剃刀视图中使用Smo对象时,我遇到了同样的错误。 显然这是因为Razor无法find项目中引用的DLL。 我通过为所有Smo dll设置“Copy Local”为true来解决这个问题,但是可能有更好的解决scheme(参见上面的Czechdude的链接)@using和web.config编辑是无用的,因为只有当您希望省略命名空间部分来自types名称(例如Server而不是Microsoft.SqlServer.Management.Smo.Server)

我的开发机器从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中都有两个版本。 查看web.config引用v1,但该应用程序引用v2。 删除引用的程序集并重新添加v1。 System.Web.WebPages.Razor等。

好吧,对我来说是不同的。 我正在使用MVC项目缺less我的控制台应用程序项目的组装。 所以,增加参考是不够的。

那么这可能会帮助别人。 去根目录web.config文件system.web – > compilation – >像这样添加你的项目引用。

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

我也有同样的问题,但问题是在大会目标框架

被引用的程序集在.NET Framework 4.6中,项目已经设置为.NET framework 4.5。

希望这能帮助那些搞糟框架的人。

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

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

包括整个名称空间

 @model namespace.myclasses.mymodel 

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

除了对<assemblies><namespaces>进行web.config更改之外,我发现GAC对程序集产生了很大的影响。 您可以像全球注册的任何核心.NET程序集一样应用文化和公钥标记。

有些人可能会在提到GAC时感到不寒而栗。 但作为一个BizTalk开发者,我已经开始接受它了。

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

public class yourClassModel {prop}

这个解决scheme为我工作(这很有趣,但工程)

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

解决scheme – 只需编辑页面,并用相同的页面replace(为我工作)

您的项目FOLDER名称需要相同。 如果你的项目或解决scheme的名称是不同的,那么MVC会伤害你。

示例:如果您创build一个新的应用程序,并获取默认名称Webapplicaiton1,则将创build该名称空间。 所以,让我们说,你不想拥有这个命名空间,所以从VS你到处可以看到“MyNamespace”。 您还可以search并replace“Webapplication1”中的所有代码,并将其replace为“MyNamespace”。 这也改变了web.config文件,所以它inculdes

现在除了剃刀视图之外,一切都将起作用。

RazorViews无法find它,因为项目的FOLDERNAME存在某种奇怪的依赖关系。 这是可怕的devise。

我已经通过将我的文件复制到一个新的解决scheme彻底地testing了这一点,唯一的区别是文件夹名称。