我目前有两个不相关的MVC3项目托管在线。

一个工作正常,另一个不工作,给我一个错误:

发现了与名为“Home”的控制器匹配的多种类型。这 如果服务此请求的路由会发生什么 ('{controller}/{action}/{id}')不指定要搜索的名称空间 与请求匹配的控制器。 如果是这样的话, 通过调用'MapRoute'方法的重载来注册这个路由 它接受一个“namespaces”参数。

我的主机的工作方式是,他给我FTP访问权限,在这个文件夹中,我有另外两个文件夹,一个用于我的应用程序。

ftpFolderA2 - foo。com ftpFolderA2 / bar。com

foo.com工作正常,我发布我的应用程序到我的本地文件系统,然后FTP内容,它工作。

当我上传并尝试运行bar.com时,上面的问题触发并阻止我使用我的网站。同时,foo.com还在运作。

是bar.com搜索从ftpFolderA2内部的控制器,这就是为什么它正在寻找另一个HomeController?我怎么能告诉它只看在控制器文件夹,因为它应该?

事实:

不使用区域。这是两个完全不相关的项目。我将每个已发布的项目放入各自的文件夹中。没有什么幻想。 每个项目只有1个HomeController。

有人能确认是这个问题吗?


当前回答

我发现这个错误可以发生在传统的ASP。当你在非App_Code目录下创建控制器时(有时Visual Studio会阻止这种情况)。

它将文件类型设置为“Compile”,而添加到“App_Code”中的任何代码都设置为“Content”。如果你复制或移动文件到App_Code,那么它仍然被设置为“Compile”。

我怀疑这与网站项目操作有关,因为网站项目没有任何构建操作。清除bin文件夹并更改为“Content”似乎可以解决这个问题。

其他回答

另一个解决方案是向ControllerBuilder注册一个默认名称空间。因为我们在主应用程序中有很多路由,而在我们的区域中只有一个通用路由(我们已经指定了一个名称空间),所以我们发现这是最简单的解决方案:

ControllerBuilder.Current
     .DefaultNamespaces.Add("YourApp.Controllers");

别人说的是对的,但对于那些仍然面临同样问题的人来说: 在我的情况下,它发生了,因为我复制了另一个项目n重命名为其他东西,但以前的输出文件在bin文件夹仍然存在…不幸的是,在重命名项目和它的命名空间后,点击Build -> Clean Solution不会删除它们…所以手动删除它们解决了我的问题!

我有两个项目在一个解决方案具有相同的控制器名称。我在第一个项目中删除了第二个项目参考,问题已经解决

可能还有另一种情况,即使你已经遵循了在区域中路由的所有步骤(比如在全局路由表中给出命名空间),也就是:

你可能没有将全局控制器包装在命名空间中 你在路由中提供了。

Eg:

这样做:

public class HomeController : Controller
{

而不是:

namespace GivenNamespace.Controllers
{
   public class HomeController : Controller
   {

同样的麻烦,什么都没用。问题是我实际上没有任何副本,这个错误出现后切换项目名称空间从MyCuteProject到MyCuteProject. web。

最后我意识到错误的来源是一个全局的。asax文件- XML标记,而不是。cs-codebehind。检查其中的命名空间,这对我很有帮助。