c# - 具有多个 Controller 的不同区域的 MVC 路由

标签 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

的索引

我已经尝试过但没有用(获取路由表中没有路由与提供的值匹配。)错误:

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/

相关文章:

c# - 单色触摸 : Loading screen

c# - OU 时间戳 ComObject

c# - 如何识别 C# 项目中未使用的类

c# - 不同的值成员,相同的控件

.net - ASP.NET MVC 项目和 App_Code 文件夹

asp.net-mvc - 根据 W3C 规范的 ASP.NET MVC 5 和 HTML 5 表单属性

ASP.NET MVC 相当于 ASP.NET WebForms 中的 "override void Render"

javascript - 即使禁用了 CORS,IIS 仍在执行请求

asp.net-mvc - 在 ASP.NET MVC 和 IIS7 中记录原始 HTTP 请求/响应

c# - 如何在 WinRT 的应用 ViewModel 中异步使用 json.net?