【问题标题】:Does Razor look in Solution Folders?Razor 是否在解决方案文件夹中查找?
【发布时间】:2013-01-17 21:18:34
【问题描述】:

我正在尝试在我的 .cshtml 文件中使用自定义命名空间中的模型。但是,每当我尝试设置模型时,Razor 都会抛出 The type or namespace name could not be found 错误。

我有一个项目设置,它使用解决方案文件夹来帮助组织,如下所示:

MyViewModel.cs 文件中的代码如下所示:

namespace MyProject.ViewModels
{
    public class MyViewModel
    {
    }
}

好的,这就是基本布局。问题是当我尝试在我的 Razor 视图中使用 MyViewModel 对象时,Razor 说它找不到命名空间。如此处所示:

我相信我正在做我应该做的每一件事。似乎 Razor 无法查看解决方案文件夹。如何让 Razor 识别 MyViewModel 对象?有什么我遗漏的吗?

请注意:我确实意识到我可以简单地更改我的 @using 语句以引用整个路径。但是,在我的项目中,我在 ViewModels 文件夹中有许多解决方案文件夹,我不想逐个指定。

更新

我接受了达林的回答,因为它成功地回答了这个问题。我还在下面提供了一些关于我的具体情况以及为什么会出现这个问题的更多信息。

我进一步研究了这个问题,并弄清楚了发生了什么。我通常使用 SparkViewEngine,它允许像这样引用我的视图模型:<viewdata model="ViewModels.MyViewModel"/> 当 Razor 不允许我以与我认为 Razor 有问题的相同方式引用视图模型时。

每个 ViewEngine 都会创建用于帮助生成视图的临时 CS 文件。 Spark 创建的临时文件使用“控制器”命名空间。在这种情况下,Spark 会在其临时 CS 文件中使用 MyProject.Controllers 命名空间。这意味着我可以在不指定完整命名空间的情况下引用ViewModels.MyViewModel 对象,因为它与生成的 CS 文件位于同一命名空间中。

Razor 生成的临时文件使用 ASP 命名空间。这意味着我不能在不指定完整命名空间的情况下引用 ViewModels.MyViewModel 对象,因为它与生成的 CS 文件不在同一个命名空间中。

【问题讨论】:

    标签: c# asp.net-mvc razor namespaces


    【解决方案1】:

    @using 指令应该指向你的命名空间:

    @using MyProject.ViewModels
    

    然后将你的模型声明为类:

    @model MyViewModel
    

    或者,直接使用全名:

    @model MyProject.ViewModels.MyViewModel
    

    【讨论】:

      【解决方案2】:

      使用@using 指令将声明视图模型的命名空间添加到剃刀视图的顶部:

      @using MvcApplication1.ViewModels
      @model MyViewModel
      

      为了避免在您想使用它的每个剃须刀视图中添加它,您可以将它添加到您的~/Views/web.config 文件的<namespaces> 部分(不要与~/web.config 混淆):

      <system.web.webPages.razor>
          <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.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="MvcApplication1.ViewModels" />
            </namespaces>
          </pages>
      </system.web.webPages.razor>
      

      还要注意我是如何指定完整命名空间的。在您展示的屏幕截图中,您似乎只使用了ViewModels.MyViewModel,但您确定这是正确的命名空间吗?通常当您在 Visual Studio 中添加类文件时,它会使用应用程序名称 + 文件夹作为命名空间的前缀,例如 MvcApplication1.ViewModels

      【讨论】:

      • 感谢您的回复。正确的命名空间是MyProject.ViewModels.MyViewModel。正如您所注意到的,我正在使用ViewModels.MyViewModel,但就在上面我声明了@using MyProject。由于我的 using 语句,我认为 Razor 会知道在 MyProject 内查找 ViewModels
      • 不,你的using语句应该是@using MyProject.ViewModels,然后你可以直接使用MyViewModel
      • 谢谢!我弄清楚发生了什么事。通常我使用 Spark 视图引擎,它允许我使用ViewModels.MyViewModel 指定模型。它归结为 Spark 在其临时文件中使用的实际命名空间以及 Razor 在其临时文件中使用的命名空间。 Spark 使用控制器命名空间,即MyProject.Controllers,它知道ViewModels.MyViewModel。 Razor 使用不知道 ViewModels.MyViewModel 的 ASP 命名空间 ASP
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多