asp.net MVC 路由 - 映射操作而不是控制器

本文关键字:控制器 操作 映射 net MVC 路由 asp | 更新日期: 2024-10-31 20:04:10

我知道它更相似(SO对此有5,600多个问题),但是我已经坐在这个问题上几天了,所以我想现在是提出问题的合适时机。

我的要求

我想在我的 asp.net mvc 应用程序中拥有以下路由:

  1. myapp.com/sigin -> 控制器 = 帐户,操作 = 登录
  2. myapp.com/signout -> 控制器 = 帐户,操作 = 注销
  3. myapp.com/joe.smith -> 控制器 = 用户,操作 = 索引
  4. myapp.com/joe.smith/following -> 控制器 = 用户,操作 = 关注
  5. myapp.com/joe.smith/tracks -> 控制器 = 轨道,操作 = 索引
  6. myapp.com/about -> 控制器 = 关于,操作 = 索引
  7. 任何其他默认路由,这就是我将标准路由留在那里的原因。

我的代码

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "About",
            url: "about",
            defaults: new { controller = "About", action = "Index" }
        );
        routes.MapRoute(
            name: "MyTracks",
            url: "{username}/tracks",
            defaults: new { controller = "MyTracks", action = "Index" }
        );
        routes.MapRoute(
            name: "MyTunes",
            url: "{username}/tunes",
            defaults: new { controller = "MyTunes", action = "Index" }
        );
        routes.MapRoute(
            name: "MyProfile",
            url: "{username}",
            defaults: new { controller = "User", action = "Index"},
            constraints: new { username = "" }
         );
        routes.MapRoute(
            name: "Account",
            url: "{action}",
            defaults: new { controller = "Account" }
        );
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

问题

3号和4号路线不起作用,

因为它们与1号和2号路线混淆。我尝试过使用 Phil Haack 的路由调试器调试我的代码,但没有运气。知道我做错了什么吗?

asp.net MVC 路由 - 映射操作而不是控制器

问题出在最后两个自定义路由中。路由框架必须使用的所有内容只是来自 URL 的单个令牌,以及与之匹配的两个可能的路由。例如,如果您尝试转到 URL,/signin ,路由框架应该如何知道没有用户名为"登录"的用户。对你来说,人类应该发生什么是显而易见的,但机器只能做这么多。

您需要以某种方式区分路线。例如,您可以执行u/{username} 。这足以帮助路由框架。除此之外,您需要在用户路由之前为每个帐户操作定义自定义路由。例如:

routes.MapRoute(
    name: "AccountSignin",
    url: "signin",
    defaults: new { controller = "Account", action = "Signin" }
);
// etc.
routes.MapRoute(
    name: "MyProfile",
    url: "{username}",
    defaults: new { controller = "User", action = "Index"},
    constraints: new { username = "" }
 );

这样,任何实际操作名称都将首先匹配。