我的解决方案结构如下:
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.
)错误:
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
{
}
访问网址http://localhost/Movies/Calendar时会发生这种情况,希望它能带我进入MovieCalendarController
索引操作方法。我可以看到它为什么抱怨,因为MovieController
中可能有一个名为Calendar
的ActionMethod(没有)。
答案 0 :(得分:2)
使用属性路由可能会更好。它会让你这样做:
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();
可以找到有关属性路由的更多信息here。
<强>更新强>
[RouteArea("Movies")]
[Route("{action}")]
public class MoviesController : BaseController
{
}
此路线将匹配以电影/ 开头的网址,后跟任何字符串,包括日历。所以这条路线会与:
发生冲突[RouteArea("Movies")]
[RoutePrefix("Calendar")]
[Route("{action=Index}")]
public class MovieCalendarController : BaseController
{
}
使用您的控制器使用的命名约定很难实现基于约定的路由。