Asp.net mvc 4 MVC4中的名称空间解析

Asp.net mvc 4 MVC4中的名称空间解析,asp.net-mvc-4,razor,Asp.net Mvc 4,Razor,我正在开发一个MVC4网站,该网站利用了区域,我们称之为“MyMVC” 与大多数MVC项目一样,在网站的根目录中有一个名为“Models”的文件夹 在这个“Models”目录中有一个名为“MyViewModel.cs”的类,它包含一个名为“MyViewModel”的公共类,其命名空间为“MyMVC.Models” 现在,在其中一个称为“Area1”的区域中,还有一个典型的MVC结构,它还包含一个名为“Models”的目录。它还包含一个类“MyViewModel.cs”,该类还包含一个名为“MyV

我正在开发一个MVC4网站,该网站利用了区域,我们称之为“MyMVC”

与大多数MVC项目一样,在网站的根目录中有一个名为“Models”的文件夹

在这个“Models”目录中有一个名为“MyViewModel.cs”的类,它包含一个名为“MyViewModel”的公共类,其命名空间为“MyMVC.Models”

现在,在其中一个称为“Area1”的区域中,还有一个典型的MVC结构,它还包含一个名为“Models”的目录。它还包含一个类“MyViewModel.cs”,该类还包含一个名为“MyViewModel”的类,这次的命名空间为“MyMVC.Areas.Area1.Models”

在我正在处理的视图中,该视图位于顶部的“Area1\Views”目录中:

@model MyMVC.Areas.Area1.Models.MyViewModel
@using MyMVC.Areas.Area1.Models
当我这样引用MyViewModel时,例如:

MyViewModel mvm = new MyViewModel();
我得到一个模棱两可的错误,它认为我引用的是另一个MyViewModel类,尽管您可以看到,我已经用@model指令和@using指令明确指定了我所引用的那个类

有人能解释什么是歧义吗

有人能解释什么是歧义吗

你不认为这种含糊不清。它在您的控制器代码中:

MyViewModel mvm = new MyViewModel();
如果在该控制器中,您同时具有以下两种功能:

using MyMVC.Models;
using MyMVC.Areas.Area1.Models;
很明显,C#编译器无法知道您引用的是哪个类。您可以通过完全指定类的名称来消除歧义:

var mvm = new MyMVC.Areas.Area1.Models.MyViewModel();

更新:

您还可以在
~/Views/web.config
文件的
部分中引用名称空间,该名称空间可以有效地在所有视图中全局地将其纳入范围

有人能解释什么是歧义吗

你不认为这种含糊不清。它在您的控制器代码中:

MyViewModel mvm = new MyViewModel();
如果在该控制器中,您同时具有以下两种功能:

using MyMVC.Models;
using MyMVC.Areas.Area1.Models;
很明显,C#编译器无法知道您引用的是哪个类。您可以通过完全指定类的名称来消除歧义:

var mvm = new MyMVC.Areas.Area1.Models.MyViewModel();

更新:


您还可以在
~/Views/web.config
文件的
部分中引用名称空间,该文件有效地将其在所有视图中全局范围内引用。

这在视图中。而且,控制器也只引用第二个,尽管我没有;我看不到控制器和视图之间的连接。在视图中?您正在视图中实例化视图模型???????哇,那你一定是做错了什么。无论如何,同样的话也适用于这一观点。您需要完全限定模型类型,以避免C#编译器可能出现的歧义。我并没有这样做。我只是举个例子。我实际上使用的是一个通用的(剑道格网,如果你必须知道的话),它有问题完全限定模型类型应该可以解决您的问题。或者重命名视图模型。我确实用@using语句完全限定了它。我在一个控制台应用程序中复制了同样的东西,但它没有问题。我错过了什么?我知道我可以通过使用完全限定来解决这个问题,我只是想理解为什么我没有提到另一个名称空间,但它认为我指的是另一个名称空间。这在视图中。而且,控制器也只引用第二个,尽管我没有;我看不到控制器和视图之间的连接。在视图中?您正在视图中实例化视图模型???????哇,那你一定是做错了什么。无论如何,同样的话也适用于这一观点。您需要完全限定模型类型,以避免C#编译器可能出现的歧义。我并没有这样做。我只是举个例子。我实际上使用的是一个通用的(剑道格网,如果你必须知道的话),它有问题完全限定模型类型应该可以解决您的问题。或者重命名视图模型。我确实用@using语句完全限定了它。我在一个控制台应用程序中复制了同样的东西,但它没有问题。我错过了什么?我知道我可以通过使用完全限定来解决它,我只是想理解为什么我没有提到另一个名称空间,但它认为我指的是另一个名称空间。