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

Jam*_*ees 7 c# asp.net-mvc

我的解决方案结构如下:

Areas
    - Games
        -Controllers
        -Views etc
    - Movies
        -Controllers
            - MoviesController.cs
            - MovieCalendarController.cs
            - MovieSearchController.cs
        -Views etc
Run Code Online (Sandbox Code Playgroud)

现在我想要能够做到这一点:导航到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 }
            );
        }
Run Code Online (Sandbox Code Playgroud)

道歉,我是领域和路线的新手

更新

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

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

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

电影控制器

[RouteArea("Movies")]
[Route("{action}")]
public class MoviesController : BaseController
{
}
Run Code Online (Sandbox Code Playgroud)

日历控制器

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

访问URL http:// localhost/Movies/Calendar时会发生这种情况,希望它能带我进入MovieCalendarControllerIndex操作方法.我可以看出它为什么抱怨,因为在被MovieController调用的Calendar(可能没有)中可能有一个ActionMethod .

Ani*_*tel 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

RouteTable.Routes.MapMvcAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)

有关属性路由的更多信息可以在此处找到。

更新

[RouteArea("Movies")]
[Route("{action}")]
public class MoviesController : BaseController
{
}
Run Code Online (Sandbox Code Playgroud)

此路由将匹配以Movies/开头的 url ,后跟任何字符串,包括Calendar。所以这条路线会与以下内容发生冲突:

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

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