我试图基于另一个程序集中的类创建一个强类型视图。但是,无论出于何种原因,我的Razor视图似乎都看不到项目中引用的其他程序集。例如
@model MyClasses.MyModel
在Visual Studio 2010中导致错误,“ MyClasses
找不到类型或名称空间名称(您是否缺少using指令或程序集引用?)。”
标准视图引擎中引用的同一类可以正常工作。尝试在我的视图主体中引用该类也遇到了同样的麻烦。
我是否缺少有关Razor的信息,还是需要以其他方式引用程序集?
我试图基于另一个程序集中的类创建一个强类型视图。但是,无论出于何种原因,我的Razor视图似乎都看不到项目中引用的其他程序集。例如
@model MyClasses.MyModel
在Visual Studio 2010中导致错误,“ MyClasses
找不到类型或名称空间名称(您是否缺少using指令或程序集引用?)。”
标准视图引擎中引用的同一类可以正常工作。尝试在我的视图主体中引用该类也遇到了同样的麻烦。
我是否缺少有关Razor的信息,还是需要以其他方式引用程序集?
Answers:
有一个新的配置部分,用于引用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以应用更改。
Copy Local = true
。外部组件可能无法正常工作。
我遇到了同样的问题:MVC3项目MyCore.Web从同一解决方案(程序集名称为MyCoreDBLayer)中的另一个项目引用MyCore.DBLayer命名空间。MyCore.DBLayer中的所有对象在Controllers and Models中均可正常运行,但在Razor视图中失败,并出现错误“类型或名称空间名称'DBLayer'在名称空间'MyCore'中不存在(您是否缺少程序集引用?)',该错误是显然不是这样。
在根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>
现在可以省略版本,文化,令牌,但将来应该修复。
Views/web.config
并且在将其放置在其中时也有效。
就我而言,包含名称空间的单独项目是控制台应用程序。将其更改为类库可解决此问题。
以上都不对我有用;
但是我终于找到了对我有用的东西:
这是因为我的构建输出进入bin \ Debug \进行调试配置,进入bin \ Release \进行发布配置。一旦将所有配置的“构建配置”更改为“ bin \”(如下图所示),一切便开始按预期工作!!!
我不知道为什么将您的内部版本分离到Release和Debug文件夹中会导致Razor语法中断,但这似乎是因为找不到组件。对我而言,存在剃刀语法问题的项目实际上是我的“剃刀库”项目。它们被设置为应用程序项目,但是我将它们用作RazorGenerator的类库来编译我的视图。当我实际尝试直接运行这些项目之一时,它导致了以下配置错误:
无法加载文件或程序集'System.Web.Helpers,版本= 3.0.0.0,区域性=中性,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。该系统找不到指定的文件。
这导致我尝试更改Build Output,因为我注意到,对于所有Web项目,Build Output似乎总是直接定位到bin文件夹,这与具有发布和调试文件夹的类库的默认设置不同。
您似乎正在寻找以下答案: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文件并运行Debug版本,然后重新打开Razor文件,或者在最坏的情况下可能需要重新启动Visual Studio。但是最终,它将把Razor文件呈现给您,就好像该命名空间列表中的所有内容都在所有视图顶部的@using语句中一样。
在ASP.NET Core MVC中,解决方案是using
在_ViewImports.cshtml中添加一个,而不是在使用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>
尝试在Razor视图中使用Smo对象时遇到相同的错误。显然这是因为Razor找不到项目中引用的DLL。我通过将所有Smo dll的“ Copy Local”设置为true来解决此问题,但是可能会有更好的解决方案(请参见上面的Czechdude的链接)@using和web.config编辑是无用的,因为仅当您希望省略名称空间时才需要它们类型名称的一部分(例如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项目组装在一起的功能。因此,添加参考文献还不够。
好吧,这可能会对其他人有所帮助。转到根web.config文件system.web
-> compilation
->这样添加您的项目引用。
<assemblies>
<add assembly="Your.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</assemblies>
您的Project FOLDER名称必须相同。如果您的项目或解决方案名称不同,则MVC会伤害您。
示例:如果创建一个新的应用程序,并且它的默认名称为Webapplicaiton1,则将创建此命名空间。因此,让我们说您不想拥有此命名空间,因此在VS中,您可以将可以看到的所有位置更改为“ MyNamespace”。您还搜索并替换“ Webapplication1”中的所有代码,并将其替换为“ MyNamespace”。这也会更改web.config文件,从而使该文件
现在,除了“剃刀”视图之外的所有内容都可以使用。
RazorViews找不到它,因为对项目的FOLDERNAME有某种奇怪的依赖关系。这是可怕的设计。
我已经通过将文件复制到新的解决方案中进行了半彻底的测试,唯一的区别是文件夹名称。
这些https://stackoverflow.com/a/7597360/808128都不适合我。甚至“将程序集引用添加到web.config根文件的system.web / compilation / assemblies部分”。因此,剩下的两种方法对我来说仍然是:1)为我的程序集添加一个公共包装类,Razor代码可以通过此包装访问该程序集;2)只需在Razor代码所在的同一程序集中将程序集逻辑添加到公共类中即可。
这个解决方案对我有用(很有趣,但是可以)
我编辑了视图页面并复制了内容并粘贴到其中,我没有更改视图的任何内容,而是进行了编辑,以便Visual Studio可以跟踪页面,然后一切开始工作
解决方案-只需编辑页面并替换为相同页面即可(对我有用)
在空间名称模型yourClassModel中,在名称类之前添加public
public class yourClassModel{
prop
}
就我而言,我尝试使用的包引用了.net standard 2.1,而我的razor类库项目设置为2.0