我的解决方案结构如下:
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
我已经尝试过但没有用(获取路由表中没有路由与提供的值匹配。
)错误:
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 }
);
}
抱歉,我是区域和路由的新手
更新
使用属性路由后我陷入了这个问题:
Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL.
The request has found the following matching controller types: MovieCalendar.UI.Areas.Movies.Controllers.MovieCalendarController MovieCalendar.UI.Areas.Movies.Controllers.MoviesController
电影 Controller
[RouteArea("Movies")]
[Route("{action}")]
public class MoviesController : BaseController
{
}
日历 Controller
[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();
可以找到更多关于属性路由的信息here .
更新
[RouteArea("Movies")]
[Route("{action}")]
public class MoviesController : BaseController
{
}
此路由将匹配以 Movies/ 开头后跟任何字符串(包括 Calendar)的 url。所以这条路线将与:
[RouteArea("Movies")]
[RoutePrefix("Calendar")]
[Route("{action=Index}")]
public class MovieCalendarController : BaseController
{
}
基于约定的路由对于您为 Controller 使用的命名约定会很困难。
关于c# - 具有多个 Controller 的不同区域的 MVC 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521396/