发现多个类型与名为' XXX'

时间:2016-04-22 08:41:01

标签: c# asp.net-mvc-4 asp.net-mvc-routing

目前我有3个名称空间:ControllersControllers.AControllersControllers.BControllers

基本上A& B只是区分两个相似但不同类别的一些类型。

现在在Controllers.AControllersControllers.BControllers中,都有一个名为MyController的控制器和名为Detail_Index的操作

当使用输入时,网址的格式为ZZZ/A/{id},我希望它会重定向它们以调用Controllers.AControllers中的控制器/操作,类似于ZZZ/B/{id}

然而结果并不像我预期的那样,似乎路径跳过第一条规则,或者匹配默认规则。并给出Multiple types were found that match the controller named 'MyController'

为什么会这样,我怎么能得到我想要的行为?下面是我目前使用的RouteConfig。



routes.MapRoute(
  "A",
  "ZZZ/A/{id}",
  new
  {
    controller = "MyController",
    type = "A",
    action = "Detail_Index",
    id = UrlParameter.Optional,
  },
  new string[] { "Controllers.AControllers" }
);

routes.MapRoute(
  "B",
  "ZZZ/B/{id}",
  new
  {
    controller = "MyController",
    type = "B",
    action = "Detail_Index",
    id = UrlParameter.Optional,
  },
  new string[] { "Controllers.BControllers" }
);


routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new
  {
  controller = "BaseController",
  action = "Search_Index",
  id = UrlParameter.Optional,
  },
  namespaces: new string[] { "Controllers" }
);




EDITED

经过一些进一步的研究,我发现我可以使用" Area"能够满足我的问题...但仍然没有具体的想法,如果我尝试使用" Area"将会删除这个问题。和成功。

2 个答案:

答案 0 :(得分:1)

您没有正确遵循惯例。我将此代码放入一个示例项目中,并能够修改项目以遵循您指定的约定以使其正常工作。但这些并不是Visual Studio创建的默认约定,这可能是您遇到问题的原因。

命名空间

您的命名空间很可能未正确指定。默认情况下,Visual Studio会设置名称空间,如MvcApplication20.Controllers.AControllers,而不是Controllers.AControllers。部分命名空间不起作用,您需要指定路径使用的控制器实际存在的整个命名空间。

控制器名称

与路线值比较时,MVC会自动切断Controller后缀。现在配置它的方式,您的控制器必须命名为MyControllerControllerBaseControllerController才能匹配。

由于您提到您的控制器实际上已命名为MyController,因此您应在默认路由值和/或URL中指定My。我猜你应该为你的BaseController提供相同的约定。

答案 1 :(得分:0)

以下是使用区域的方法:

为您的MVC项目添加两个新区域,称为A和B或您需要的任何内容。使用Detail_Index操作添加MyController类,并为每个区域添加相应的视图:

namespace MyApp.Areas.A.Controllers
{
  public class MyController : Controller
  {
    public ActionResult Detail_Index()
    {
        return View();
    }
  }
}

namespace MyApp.Areas.B.Controllers
{
  public class MyController : Controller
  {
    public ActionResult Detail_Index()
    {
        return View();
    }
  }
}

您应该在相应的配置类中注册首选路由:

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "A",
            "ZZZ/A/{id}",
            new { controller = "My", action = "Detail_Index", id = UrlParameter.Optional }
        );
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "B",
            "ZZZ/B/{id}",
            new { controller = "My", action = "Detail_Index", id = UrlParameter.Optional }
        );
    }

你应该致电:

   AreaRegistration.RegisterAllAreas();

在Global.asax的Application_Start方法中注册新路由并完成。