我的ASP.NET MVC网站允许用户注册并为自己提供用户名,这些用户名将是唯一的,并允许其他人使用包含其名称的干净URL浏览他们的页面,如Twitter,Facebook,LinkedIn等。< / p>
例如:
等
问题是第一个URL段可能用于其他“常规”控制器/操作,例如:
所以基本上我寻求的路由方案如下:如果第一个URL段是一个已知的控制器,将其视为一个控制器(并照常解析相关的操作和参数),但如果不是 - 将其视为用户名,并将其传递给专用控制器+动作,该动作将对其进行解析并继续进行。
我不希望一个解决方案,它会强制我为我拥有的每个特定控制器添加路由,这样路由模块将遍历所有控制器并且找不到匹配,它将到达为该特殊用户名段定义路由的最后一个。原因主要是维护(例如,每次编写新控制器时都必须记住添加路由。)
我假设我可以实现自己的MvcRouteHandler
/ IRouteHandler
,但我觉得必须有更简单的解决方案,不会让我调整MVC的开箱即用路由机制。
注意:我读过How to achieve nice litle USER page url like facebook or twitter?并且它没有回答我的问题,它只是说有一个URL重写模块。
你知道有什么好的,优雅的,干净的方法吗?
答案 0 :(得分:2)
你应该让你的第一条路线成为你的Usesr路线,路线约束与我在这个答案中所描述的一致:MVC routing question。
如果您的路线采用{username} / {controller} / {id}格式,则此路线应涵盖所有意外情况。
答案 1 :(得分:0)
,您可以映射您的路线 在registerRoutes()方法中你可以这样做:
routes.MapRoute(
"ToonStudenten", // Route name
"{controller}/{action}/{userID}, // URL with parameters
new { controller = "Docent", action = "ToonStudenten", userID = UrlParameter.Optional} // Parameter defaults
);
我相信你可以通过这个mapRouting改变你的观点的样子,但不完全确定如何...会尝试并搜索它
你可能想看一下这篇文章: MVC 3 keeping short url
您无需为每个网址设置路线。在路线限制的帮助下,您可以执行以下操作:
routes.MapRoute(
"Home", // Route name
"{action}", // URL with parameters
new { controller = "Home", action = "Index" }, // Parameter defaults
new { action = "TaskA|TaskB|TaskC|etc" } //Route constraints
);
routes.MapRoute(
"Account", // Route name
"{action}", // URL with parameters
new { controller = "Account", action = "Logon" }, // Parameter defaults
new { action = "Logon|Logoff|Profile|FAQs|etc" } //Route constraints
);