3

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

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

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

namespace MyProject.ViewModels
{
    public class MyViewModel
    {
    }
}

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

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

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

更新

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

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

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

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

4

2 回答 2

4

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

@using MvcApplication1.ViewModels
@model MyViewModel

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

于 2013-02-02T19:01:17.570 回答
1

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

@using MyProject.ViewModels

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

@model MyViewModel

或者,直接使用全名:

@model MyProject.ViewModels.MyViewModel
于 2013-02-02T19:00:44.947 回答