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

tec*_*414 98 asp.net-mvc razor asp.net-mvc-3

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

@model MyClasses.MyModel
Run Code Online (Sandbox Code Playgroud)

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

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

我错过了一些关于Razor的东西,还是我需要以其他方式引用装配?

que*_*rin 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>
Run Code Online (Sandbox Code Playgroud)

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

@using Your.Namespace.Etc;
<!DOCTYPE html>
<head>
....
Run Code Online (Sandbox Code Playgroud)

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

  • 这可行,但请确保您的程序集使用`Copy Local = true`引用.外部组件可能不起作用. (18认同)
  • 我不得不关闭并重新打开视觉工作室,以便工作. (7认同)
  • 这里应该注意的是,如果您使用来自“虚拟”源(例如数据库)的视图而不是使用真实的视图文件,则必须将其放入 ROOT web.config 文件中,以便视图中的代码正常工作。 (2认同)
  • @Terry,即使对于某些System root命名空间程序集,似乎还需要Copy local = true. (2认同)
  • 我的程序集是在运行时加载的,因此无法使用web.config文件添加它们。还有什么我可以尝试的吗?有没有办法使用自己的web.config文件导入外部视图?这很奇怪,因为我要在与视图相同的程序集中引用名称空间。 (2认同)

V.B*_*.B. 54

我有同样的问题:MVC3项目MyCore.Web从同一解决方案中的另一个项目(使用程序集名称MyCoreDBLayer)引用MyCore.DBLayer命名空间.来自MyCore.DBLayer的所有对象在控制器和模型中都能很好地工作,但在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>
Run Code Online (Sandbox Code Playgroud)

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


Sam*_*Sam 18

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


Syl*_*via 12

以上都不适合我;

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

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

这是因为我将构建输出转到bin\Debug\for Debug配置和bin\Release\for Release configuations.一旦我将Build Configuation更改为所有配置的"bin"(如下图所示),那么一切都开始正常工作!

构建配置

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

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

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

  • 天啊!经过长时间寻找解决方案,这终于解决了我在类库项目中的 Razor 视图!!非常感谢。 (2认同)
  • 逆天!我正在将我的类视图库构建到另一个项目的目录中,并遇到了这个问题。构建路径需要是 bin\ 才能工作。现在使用 post build xcopy 代替。 (2认同)

Chr*_*ini 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>
Run Code Online (Sandbox Code Playgroud)

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

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

Visual Studio多年来变得越来越困难,因此可能需要关闭运行Debug构建的Razor文件,然后重新打开Razor文件,或者最坏的情况是需要重新启动Visual Studio.但最终它会向您呈现Razor文件,就好像该命名空间列表中的所有内容都位于所有视图顶部的@using语句中一样.


rad*_*byx 5

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
Run Code Online (Sandbox Code Playgroud)

看法

@model LoginViewModel // Add to _ViewImports to make this line work
<div>This is the View for the login screen.</div>
Run Code Online (Sandbox Code Playgroud)


use*_*480 5

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