您可以将默认控制器定义为您所在区域的入口点,但不能在路由时跳过控制器名称。否则,您必须为策略控制器中的每个操作创建一个默认路由:
public override void RegisterArea(AreaRegistrationContext context) { // Entry point for each action on Policy controller context.MapRoute( "Policy_default_detail", "Policy/Detail/{id}", new { controller = "Policy", action = "Detail", id = UrlParameter.Optional } ); context.MapRoute( "Policy_default_anotheraction", "Policy/AnotherAction/{id}", new { controller = "Policy", action = "AnotherAction", id = UrlParameter.Optional } ); // Default entry point context.MapRoute( "Policy_default", "Policy/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); }
此设计的缺点是您无法在策略控制器上拥有与操作名称相同的控制器。
我建议您重新考虑区域命名,以便该区域的名称与控制器的名称不匹配。
您可以在通用区域注册代码之前在区域注册类中添加特定的路由定义。
public class PolicyAreaRegistration : AreaRegistration { public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Policy_Tricky", "Policy/{action}/{id}", new { action = "Index", controller = "Policy", id = UrlParameter.Optional }, new string[] { "YourProjectName.Areas.Policy.Controllers" } ); context.MapRoute( "Policy_default", "Policy/{controller}/{action}/{id}", new { action = "Index", controller = "Home", id = UrlParameter.Optional }, new string[] { "YourProjectName.Areas.Policy.Controllers" } //Providing namespace while defining route to prevent conflict ); } }