具有多个控制器的不同区域的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 { }
使用您的控制器的命名约定时,基于约定的路由将很困难。