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

C# asp.net mvc路由-映射操作而不是控制器,c#,asp.net-mvc,routes,C#,Asp.net Mvc,Routes,我知道更多的是相同的(所以有更多的关于这个),但是我已经坐在这个上面好几天了,所以我想现在是问问题的时候了 我的要求 我希望在我的asp.net mvc应用程序中有以下路由: myapp.com/sigin->Controller=Account,Action=sign myapp.com/signout->Controller=Account,Action=signout myapp.com/joe.smith->Controller=User,Action=Index myapp.com/j

我知道更多的是相同的(所以有更多的关于这个),但是我已经坐在这个上面好几天了,所以我想现在是问问题的时候了

我的要求 我希望在我的asp.net mvc应用程序中有以下路由:

  • myapp.com/sigin->Controller=Account,Action=sign
  • myapp.com/signout->Controller=Account,Action=signout
  • myapp.com/joe.smith->Controller=User,Action=Index
  • myapp.com/joe.smith/following->Controller=User,Action=following
  • myapp.com/joe.smith/tracks->Controller=tracks,Action=Index
  • myapp.com/about->Controller=about,Action=Index
  • 任何其他默认路线,这就是为什么我把标准路线留在那里
  • 我的代码
    问题
    3号线和4号线与1号线和2号线混在一起,根本不起作用。我试着用Phil Haack的调试代码,但没有成功。你知道我做错了什么吗?

    问题出在你的最后两条自定义路线上。路由框架需要处理的只是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中为每个操作设置一个路由。
    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 = "" }
     );