C# asp.net mvc路由-映射操作而不是控制器
我知道更多的是相同的(所以有更多的关于这个),但是我已经坐在这个上面好几天了,所以我想现在是问问题的时候了 我的要求 我希望在我的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
问题
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 = "" }
);