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

时间:2015-07-20 16:14:57

标签: c# asp.net-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.)错误:

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(没有)。

1 个答案:

答案 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
{
}

使用您的控制器使用的命名约定很难实现基于约定的路由。