目前我有3个名称空间:Controllers
,Controllers.AControllers
,Controllers.BControllers
基本上A
& B
只是区分两个相似但不同类别的一些类型。
现在在Controllers.AControllers
和Controllers.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"将会删除这个问题。和成功。答案 0 :(得分:1)
您没有正确遵循惯例。我将此代码放入一个示例项目中,并能够修改项目以遵循您指定的约定以使其正常工作。但这些并不是Visual Studio创建的默认约定,这可能是您遇到问题的原因。
您的命名空间很可能未正确指定。默认情况下,Visual Studio会设置名称空间,如MvcApplication20.Controllers.AControllers
,而不是Controllers.AControllers
。部分命名空间不起作用,您需要指定路径使用的控制器实际存在的整个命名空间。
与路线值比较时,MVC会自动切断Controller
后缀。现在配置它的方式,您的控制器必须命名为MyControllerController
和BaseControllerController
才能匹配。
由于您提到您的控制器实际上已命名为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方法中注册新路由并完成。