MVC路由匹配路由无效

时间:2015-03-30 15:20:47

标签: c# asp.net-mvc model-view-controller asp.net-mvc-5.2

问题

对于默认路由,MVC返回“找到的多个类型与名为'admin'的控制器匹配。”错误而不是找不到404。该命名空间中没有管理员控制器。

我们正在使用MVC 5.2.2。

背景

我们正在使用MVC领域。两个区域包含“admin”控制器。当您使用各自路径中定义的完整路径时,两个区域的管理控制器都可以访问并正常工作。

当您尝试从默认路由访问“admin”时出现问题。管理员在该上下文中不存在,因此我们期望找不到404,但是我们会收到:

 Multiple types were found that match the controller named 'admin'. This can happen 
 if the route that services this request ('{controller}/{action}/{id}') does not 
 specify namespaces to search for a controller that matches the request. If this 
 is the case, register this route by calling an overload of the 'MapRoute' method 
 that takes a 'namespaces' parameter.

  The request for 'admin' has found the following matching controllers:
  DMP.Stock.Web.Controllers.AdminController
  DMP.Inventory.Web.Controllers.AdminController 

这是我们的默认路线和两条地区路线:

 public static void RegisterRoutes(RouteCollection routes)
 {
   // Default Route
   routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "DMP.Core.Web.Controllers" }
    );
 }

 public override void RegisterArea(AreaRegistrationContext context)
 {
   // Area 1: Stock
   context.MapRoute(
    name: "Stock_default",
    url: "Stock/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "DMP.Stock.Web.Controllers" }
     );
 }

 public override void RegisterArea(AreaRegistrationContext context)
 {
  // Area 2: Inventory 
  context.MapRoute(
   "Inventory_default",
   "Inventory/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "DMP.Inventory.Web.Controllers" }
     );
 }

/ Stock / Admin / Index工作正常。

/库存/管理员/索引正常工作。

/ Admin /无法正常工作(期望:找不到404,收到“多个控制器”错误)。

错误建议我们在路由中添加名称空间,但正如您在上面看到的那样,默认区域和两个区域都已经有了名称空间定义。默认路由指向名称空间,其中没有任何“admin”控制器。

我认为MVC试图通过搜索可能匹配请求的URL的可能控制器来“有用”。有什么方法可以把它关掉吗?

1 个答案:

答案 0 :(得分:5)

我自己能够解决这个问题。这是我找到的解决方案:

 // Default Route
 routes.MapRoute(
   name: "Default",
   url: "{controller}/{action}/{id}",
   defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
   namespaces: new string[] { "DMP.Core.Web.Controllers" }
        ).DataTokens["UseNamespaceFallback"] = false;

注意添加.DataTokens [" UseNamespaceFallback"] = false;这就解决了这个问题。关于此功能没有(任何?)文档,但我在阅读MVC源代码时发现它,特别是在DefaultControllerfactory(本期的来源)中。

在你知道google for" UseNamespaceFallback"你可以找到一些博客文章和问题,其中人们有类似的问题并以同样的方式解决它。但是我在这个DataToken上找不到MSDN文档。