asp.net MVC 路由 - 映射操作而不是控制器
本文关键字:控制器 操作 映射 net MVC 路由 asp | 更新日期: 2024-10-31 20:04:10
我知道它更相似(SO对此有5,600多个问题),但是我已经坐在这个问题上几天了,所以我想现在是提出问题的合适时机。
我的要求
我想在我的 asp.net mvc 应用程序中拥有以下路由:
- myapp.com/sigin -> 控制器 = 帐户,操作 = 登录
- myapp.com/signout -> 控制器 = 帐户,操作 = 注销
- myapp.com/joe.smith -> 控制器 = 用户,操作 = 索引
- myapp.com/joe.smith/following -> 控制器 = 用户,操作 = 关注
- myapp.com/joe.smith/tracks -> 控制器 = 轨道,操作 = 索引
- myapp.com/about -> 控制器 = 关于,操作 = 索引
- 任何其他默认路由,这就是我将标准路由留在那里的原因。
我的代码
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 的路由调试器调试我的代码,但没有运气。知道我做错了什么吗?
问题出在最后两个自定义路由中。路由框架必须使用的所有内容只是来自 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 = "" }
);
这样,任何实际操作名称都将首先匹配。