如何使用自定义用户ID实现干净的URL路由?

时间:2011-08-28 12:29:59

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我的ASP.NET MVC网站允许用户注册并为自己提供用户名,这些用户名将是唯一的,并允许其他人使用包含其名称的干净URL浏览他们的页面,如Twitter,Facebook,LinkedIn等。< / p>

例如:

  • mysite.com/的 michael.guthrie
  • mysite.com/的约翰
  • mysite.com/的约翰 /图像
  • mysite.com/的约翰 /博客

问题是第一个URL段可能用于其他“常规”控制器/操作,例如:

  • mysite.com/about
  • mysite.com/register

所以基本上我寻求的路由方案如下:如果第一个URL段是一个已知的控制器,将其视为一个控制器(并照常解析相关的操作和参数),但如果不是 - 将其视为用户名,并将其传递给专用控制器+动作,该动作将对其进行解析并继续进行。

不希望一个解决方案,它会强制我为我拥有的每个特定控制器添加路由,这样路由模块将遍历所有控制器并且找不到匹配,它将到达为该特殊用户名段定义路由的最后一个。原因主要是维护(例如,每次编写新控制器时都必须记住添加路由。)

我假设我可以实现自己的MvcRouteHandler / IRouteHandler,但我觉得必须有更简单的解决方案,不会让我调整MVC的开箱即用路由机制。

注意:我读过How to achieve nice litle USER page url like facebook or twitter?并且它没有回答我的问题,它只是说有一个URL重写模块。

你知道有什么好的,优雅的,干净的方法吗?

2 个答案:

答案 0 :(得分:2)

你应该让你的第一条路线成为你的Usesr路线,路线约束与我在这个答案中所描述的一致:MVC routing question

如果您的路线采用{username} / {controller} / {id}格式,则此路线应涵盖所有意外情况。

答案 1 :(得分:0)

在global.asax文件中

,您可以映射您的路线 在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
);