具有多个控制器的不同区域的MVC路由

我的解决方案结构如下:

Areas - Games -Controllers -Views etc - Movies -Controllers - MoviesController.cs - MovieCalendarController.cs - MovieSearchController.cs -Views etc 

现在我想要能够做到这一点:导航到https:// localhost / Movies /并点击MoviesController.cs的索引

导航到: https:// localhost / Movies / Calendar /并点击MovieCalendarController.cs的索引

最后导航到https:// localhost / Movies / Search /并点击MovieSearchController.cs的索引

我尝试但没有工作( No route in the route table matches the supplied values.获取No route in the route table matches the supplied values. )错误:

MovieAreaRegistration.cs

 public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Movies_default", "Movies/{action}/{id}", new { controller = "Movies", action = "Index", id = UrlParameter.Optional } ); context.MapRoute( "Calendar_default", "Movies/Calendar/", new { controller = "MovieCalendar", action = "Index", id = UrlParameter.Optional } ); context.MapRoute( "Search_default", "Movies/Search/{action}/{id}", new { controller = "MovieSearch", action = "Index", id = UrlParameter.Optional } ); } 

道歉,我是区域和路由的新手

更新

使用属性路由后我遇到了这个问题:

找到了与URL匹配的多种控制器类型。 如果多个控制器上的属性路由与请求的URL匹配,则会发生这种情

该请求已找到以下匹配的控制器类型:MovieCalendar.UI.Areas.Movies.Controllers.MovieCalendarController MovieCalendar.UI.Areas.Movies.Controllers.MoviesController

电影控制器

 [RouteArea("Movies")] [Route("{action}")] public class MoviesController : BaseController { } 

日历控制器

 [RouteArea("Movies")] [RoutePrefix("Calendar")] [Route("{action=Index}")] public class MovieCalendarController : BaseController { } 

当访问URL http:// localhost / Movies / Calendar时 ,会发生这种情况,希望它能带我进入MovieCalendarController Index操作方法。 我可以看到它为什么抱怨,因为MovieController可能有一个名为Calendar的ActionMethod(没有)。

使用属性路由可能会更好。 它会让你这样做:

  public class MoviesController : Controller { [Route("Movies")] public ActionResult Index() { return this.View(); } } public class MovieCalendarController : Controller { [Route("Movies/Calendar")] public ActionResult Index() { return this.View(); } } 

然后你可以摆脱当前的路由映射并使用这个初始化你的路由:

 RouteTable.Routes.MapMvcAttributeRoutes(); 

有关属性路由的更多信息,请参见此处 。

更新

 [RouteArea("Movies")] [Route("{action}")] public class MoviesController : BaseController { } 

此路线将匹配以Movies /开头的url,后跟任何字符串,包括日历 。 所以这条路线将与:

 [RouteArea("Movies")] [RoutePrefix("Calendar")] [Route("{action=Index}")] public class MovieCalendarController : BaseController { } 

使用您的控制器的命名约定时,基于约定的路由将很困难。