【问题标题】:asp.net mvc routing - map actions not controllersasp.net mvc 路由 - 映射操作而不是控制器
【发布时间】:2015-03-06 14:48:14
【问题描述】:

我知道它几乎是一样的(所以在这个上面有超过 5,600 questions),但我已经坐在这个上面好几天了,所以我想现在是提出问题的正确时机。

我的要求

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

  1. myapp.com/sigin -> 控制器 = 帐户,操作 = 登录
  2. myapp.com/signout -> 控制器 = 帐户,操作 = 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 的 routing debugger 调试我的代码,但没有运气。任何想法我做错了什么?

【问题讨论】:

    标签: c# asp.net-mvc routes


    【解决方案1】:

    问题在于您的最后两条自定义路线。路由框架必须使用的只是来自 URL 的单个令牌,以及与之匹配的两个可能的路由。例如,如果您尝试访问 URL /signin,路由框架应该如何知道没有用户名为“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 = "" }
     );
    

    这样,任何实际的动作名称都会首先匹配。

    【讨论】:

    • 我完全同意你的观点,机器只能做这么多,但是,我希望有一个技巧,我不必去手动将所有路由添加到我的帐户控制器,所以我可以与配置文件控制器区分开来。底线,如果我想保持这样的路线,我必须为 accountcontroller 和 myprofilecontroller 中的每个操作都有一个路线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多