我的 ASP.NET MVC 3 项目遇到以下错误:
找到了与名为“Home”的控制器匹配的多种类型。如果为该请求提供服务的路由 ('Home/{action}/{id}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用采用“namespaces”参数的“MapRoute”方法的重载来注册此路由。 'Home' 的请求找到了以下匹配的控制器: MyCompany.MyProject.WebMvc.Controllers.HomeController MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController
我的默认控制器文件夹中有一个 HomeController,其类名为 MyCompany.MyProject.WebMvc.Controllers.HomeController。
我的 global.asax 中的 RegisterRoutes 方法如下所示:
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 }
);
}
这一切都导致了我在本文开头强调的错误。我正在努力尝试从其他各种帖子中拼凑出一个解决方案,但没有运气。
是否可以在默认控制器文件夹中有一个 HomeController,然后在每个区域中有一个?如果是这样,我是否需要(假设我这样做)更改我的配置文件以使其工作?
任何帮助将非常感激!
错误消息包含推荐的解决方案:“如果是这种情况,请通过调用采用 '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 的 Index 操作,我认为这就是您想要的。 http://server/company/home 将转到公司区域的 HomeController 的索引操作,如区域注册中所定义。
这是 asp.net mvc4 方法:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
namespaces: new[] { "YourCompany.Controllers" }
);
我已经重命名了命名空间,所以,我只删除了 de 文件夹 bin 和 obj 并重建,再次工作。
如果您使用的是 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
}
用这个
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "ProjectName.Controllers" }
);
仅使用项目名称:
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
我有同样的问题,发现旧版本在“bin”文件夹中创建了编译文件。
一旦我删除了这些错误就消失了。
正如 Chris Moschini 提到的,如果您有两个具有相同控制器名称和不同命名空间的区域,并且默认的无区域路由将返回 500 服务器错误,则命名空间参数可能不够。
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;
在我添加对具有相同路由的另一个项目的引用后,我遇到了这个问题,并且在我删除引用后问题继续存在。
通过从 bin 文件夹中删除该添加引用的 .dll 文件并重新构建来解决。
像许多其他人一样,在从 VS2017 菜单创建新的 MVC 模板项目后,我遇到了这个问题,在构建项目时,我会收到操作的错误消息。然后,我使用 cooloverride 在此线程前面发布的答案 https://stackoverflow.com/a/15651619/2417292 用于 mvc4 项目。这仍然没有解决我的问题,所以我将我的主视图文件夹和 HomeController 文件重命名为视图文件夹 Company/ 和控制器文件 CompanyController。然后这对我有用,不是每个人说的修复,而是一种解决方法,如果你没有坚持使用 Home/Index 路由,我的另一个问题是我找不到导致错误的参考,并且由于我的开发平台是 Azure WebApplication vs具有完整文件系统和 IIS 设置的完整 VM。
对于 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");
这个问题是我不小心添加的时候出现的
[Route("api/[controllers]s")]
代替
[RoutePrefix("api/[controllers]s")]
到我的 ApiController 的顶部。
namespaces
参数是一个字符串数组,所以你应该可以通过添加到数组中来传递任何数字:new string[] { "MyCompany.MyProject.WebMvc.Controllers", "My.Second.Namespace", "My.Third.Namespace", "Namespaces.Etc" }
MyProject.Controllers
但确实如此。MyCompany.MyProject.WebMvc.Areas.Company.Controllers.HomeController
正在执行。但出现的视图是旧的。