我的ASP.NET MVC 3项目遇到以下错误:
找到匹配的多种类型 控制器名为'Home'。这个可以 如果服务于此的路线发生 请求('Home / {action} / {id}') 不指定名称空间来搜索a 与请求匹配的控制器。 如果是这种情况,请注册 通过调用重载路由 'MapRoute'方法需要一个 'namespaces'参数。
'Home'的请求找到了 以下匹配控制器: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController
我的默认控制器文件夹中有一个HomeController,类名为MyCompany.MyProject.WebMvc.Controllers.HomeController。
我的globalRastes方法,在我的global.asax中,看起来像:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
然后我有一个名为Company的区域,在该区域的默认控制器文件夹中有一个HomeController,类名为MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController。
CompanyAreaRegistration文件中的RegisterArea方法如下所示:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Company_default",
"Company/{controller}/{action}/{id}",
new { area = "Company", action = "Index", id = UrlParameter.Optional }
);
}
这是我在本文开头突出显示的错误。我正在努力拼凑其他各种帖子的解决方案, NO LUCK 。
是否可以在默认控制器文件夹中有一个HomeController,然后在每个区域中有一个?如果是这样,我是否需要对我的配置文件进行更改(假设我这样做)才能使其正常工作?
非常感谢任何帮助!
答案 0 :(得分:162)
错误消息包含推荐的解决方案:“如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由。”
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new string[] { "MyCompany.MyProject.WebMvc.Controllers"}
);
这将使http://server/转到你的HomeController的索引动作,我认为这是你想要的。 http://server/company/home将转到公司区域的HomeController的Index操作,如区域注册中所定义。
答案 1 :(得分:28)
这是asp.net mvc4方法:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
namespaces: new[] { "YourCompany.Controllers" }
);
答案 2 :(得分:9)
我已重命名名称空间,因此,我只删除 de文件夹 bin 和 obj 以及重建,再次工作。
答案 3 :(得分:2)
答案 4 :(得分:2)
使用此
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "ProjectName.Controllers" }
);
答案 5 :(得分:1)
仅使用项目名称:
Public Class RouteConfig
Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.MapRoute( _
name:="Default", _
url:="{controller}/{action}/{id}", _
defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
, namespaces:={"MvcAreas"})
End Sub
答案 6 :(得分:1)
如果您使用的是RazorGenerator,只需通知namespaces
参数即可。
我必须解决在Global.asax.cs
添加下面标记的声明:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Controllers"); // This one
}
答案 7 :(得分:0)
正如Chris Moschini所提到的,如果你有两个具有不同名称空间的相同控制器名称的区域,并且默认的无区域路由将返回500服务器错误,那么namespaces参数可能还不够。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new string[] { "MyCompany.MyProject.WebMvc.Controllers"}
);
它"最好"覆盖默认路由处理程序并添加以下行:
RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;
答案 8 :(得分:0)
在添加对具有相同路线的另一个项目的引用后,出现了此问题,并且在删除引用后问题仍然存在。
通过从bin文件夹中删除添加的引用的.dll文件并重建来解决。
答案 9 :(得分:0)
与其他许多人一样,从VS2017菜单创建新的MVC模板项目后,在构建项目时遇到此错误消息,我遇到了这个问题。然后,我使用了https://stackoverflow.com/a/15651619/2417292在此主题前面发布的答案cooloverride 用于mvc4项目。 这仍然不能解决我的问题,因此我将主视图文件夹和HomeController文件重命名为视图文件夹Company /和控制器文件CompanyController。然后这对我有用,不是说一个修复,而是一个解决方法,如果您不坚持使用Home / Index路由,我的另一个问题是我找不到导致错误的引用,并且由于我的开发平台是Azure WebApplication vs.具有完整文件系统和IIS设置的完整VM。
答案 10 :(得分:0)
我遇到了同样的问题,发现旧版本已在“ bin”文件夹中创建了编译文件。
删除这些错误后,错误消失了。
答案 11 :(得分:0)
对于MVC5,以下代码适用于在不同区域发布相同的控制器名称。您必须指定必须首先按下哪个区域控制器。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "ApplicationName.Areas.AreaName.Controllers" }
).DataTokens.Add("area", "AreaName");