【问题标题】:MVC Routing with different Areas with multiple controllers具有多个控制器的不同区域的 MVC 路由
【发布时间】:2015-07-20 16:14:56
【问题描述】:

我的解决方案结构如下:

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 匹配的控制器类型。这个可以 如果多个控制器上的属性路由与请求的匹配,则会发生 网址。

请求找到了以下匹配的控制器类型: 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 索引操作方法。我可以看到它为什么会抱怨,因为在 MovieController 中可能有一个 ActionMethod,称为 Calendar(没有)。

【问题讨论】:

  • 您是否在 global.asax Application_Start 中运行过类似的操作? Areas.MVC.MVCAreaRegistration.RegisterAllAreas() 其中 Areas.MVC.MVCAreaRegistration 是您的 RegisterAreas 方法的命名空间?
  • MovieAreaRegistration 是由 Visual Studio 创建的脚手架代码。在电影区域文件夹下。

标签: c# asp.net-mvc


【解决方案1】:

属性路由可能会更好。它会让你这样做:

   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();
        }
    }

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

RouteTable.Routes.MapMvcAttributeRoutes();

更多关于属性路由的信息可以在here找到。

更新

[RouteArea("Movies")]
[Route("{action}")]
public class MoviesController : BaseController
{
}

此路由将匹配以 Movies/ 开头的 url,后跟任何字符串,包括 Calendar。所以这条路线将与:

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

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

【讨论】:

  • 这似乎对我不起作用。我只是不断得到404。我也将MapMvcAttributeRoutes(); 添加到我的RouteConfig.cs 中...
  • 我已经用我面临的问题更新了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多