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


101

我试图基于另一个程序集中的类创建一个强类型视图。但是,无论出于何种原因,我的Razor视图似乎都看不到项目中引用的其他程序集。例如

@model MyClasses.MyModel

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

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

我是否缺少有关Razor的信息,还是需要以其他方式引用程序集?


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

Answers:


107

有一个新的配置部分,用于引用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以应用更改。


18
此方法有效,但是请确保使用引用了您的程序集Copy Local = true。外部组件可能无法正常工作。
特里

1
这里应该注意,如果您使用的是“虚拟”源(例如DB)的视图,而不是使用实际的视图文件,则必须将其放在ROOT web.config文件中,以便视图中的代码起作用。
NightOwl888

2
@Terry,看来即使对于某些系统根命名空间程序集也必须使用copy local = true。
Dan Esparza

2
我的程序集是在运行时加载的,因此无法使用web.config文件添加它们。还有什么我可以尝试的吗?有没有办法使用自己的web.config文件导入外部视图?这很奇怪,因为我要在与视图相同的程序集中引用名称空间。
马克西姆六世。

不需要重新启动Visual Studio。只需关闭并重新打开视图就足够了。
user247702 2015年

58

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

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

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


此解决方案有效,但这不是一个好主意。当我将所有类都设置为内部并且使Web程序集成为MyCoreDBLayer的朋友时,它停止工作。我最终编写了一个公共类作为MVC模型,该模型将来自朋友程序集的类包裹起来。我相信除了Razor视图中MVC的模型名称空间之外,不应使用其他类-总是可以编写包装器
VB

这对我有用,我尝试将其添加到中,Views/web.config并且在将其放置在其中时也有效。
guanome

18

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


1
这为我解决了。首先,我尝试制作类库(包),但是遇到了引用我需要的nuget包的问题。最好不要幻想,只是制作一个基本的类库(DLL)
redwards510

15

以上都不对我有用;

  • Dll设置为“复制本地”
  • 向两个web.configs中添加名称空间没有任何作用
  • 将程序集引用添加到system.web \ compilation \ assemblies也无济于事(尽管我还没有删除这些引用,因此可能也需要它们)

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

这是因为我的构建输出进入bin \ Debug \进行调试配置,进入bin \ Release \进行发布配置。一旦将所有配置的“构建配置”更改为“ bin \”(如下图所示),一切便开始按预期工作!!!

构建配置

我不知道为什么将您的内部版本分离到Release和Debug文件夹中会导致Razor语法中断,但这似乎是因为找不到组件。对我而言,存在剃刀语法问题的项目实际上是我的“剃刀库”项目。它们被设置为应用程序项目,但是我将它们用作RazorGenerator的类库来编译我的视图。当我实际尝试直接运行这些项目之一时,它导致了以下配置错误:

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

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


1
通过方式已确认,一旦dll直接位于bin文件夹中,则不需要system.web \ compilation \ assemblies部分。这可以回到<compilation debug =“ true” targetFramework =“ 4.5.1” />
Sylvia

2
天啊!经过大量时间寻找解决方案后,这终于解决了我在类库项目中的Razor视图!非常感谢。
赫拉,2015年

2
难以置信的!我正在将我的类的视图库构建到另一个项目的目录中,并且遇到了这个问题。构建路径必须为bin \才能起作用。现在使用post build xcopy代替。
GlacialSpoon

1
我在类库项目中使用Razor Engine,并且遇到了相同的问题。将输出路径设置为“ bin \”也为我解决了此问题。像GlacialSpoon一样,我在后构建步骤中将程序集复制到正确的输出文件夹。这不是最佳方法,但至少是Intellisense,它引用程序集和语法突出显示。
Octoate

值得注意的是,如果您的自定义输出目录指向目录ala'.. \ some \ dir \' ,则会出现原始问题。但是,如果将输出目录更改为“ some \ dir \”,则一切正常。当然,这是矩阵中的恶性故障。
XDS

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文件并运行Debug版本,然后重新打开Razor文件,或者在最坏的情况下可能需要重新启动Visual Studio。但是最终,它将把Razor文件呈现给您,就好像该命名空间列表中的所有内容都在所有视图顶部的@using语句中一样。


4

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>

3

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


感谢@ user1619480,我遇到了同样的问题,在我的情况下,我使用VS 2017添加了.Net Framework类库,由于某种原因,输出类型为控制台应用程序。
danfer

1

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


1

将我的开发机器从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等。


+1 thx这是我的最后一点,现在我可以调试asp.net mvc 4 hohoho!
13年

1

好吧,对我来说是不同的。我缺少将控制台应用程序项目与MVC项目组装在一起的功能。因此,添加参考文献还不够。

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

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


1

我也遇到了同样的问题,但是问题出在程序集Target框架上

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

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


1

您的Project FOLDER名称必须相同。如果您的项目或解决方案名称不同,则MVC会伤害您。

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

现在,除了“剃刀”视图之外的所有内容都可以使用。

RazorViews找不到它,因为对项目的FOLDERNAME有某种奇怪的依赖关系。这是可怕的设计。

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


令人难以置信的是这是多么的嘲笑!我已将项目文件夹名称重命名为正确的名称,然后在文本文件中打开解决方案并更正了文件夹说明!有效!我正在使用Visual Studio 2019
Daniel

0

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

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



0

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


0

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

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


0

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

我编辑了视图页面并复制了内容并粘贴到其中,我没有更改视图的任何内容,而是进行了编辑,以便Visual Studio可以跟踪页面,然后一切开始工作

解决方案-只需编辑页面并替换为相同页面即可(对我有用)



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.