Stackoverflow样式URL(自定义传出URL)

时间:2013-04-09 14:09:20

标签: c# asp.net-mvc-3 url asp.net-routing

如果我导航到以下stackoverflow网址http://stackoverflow.com/questions/15532493,它会自动附加问题的标题,如下所示:

http://stackoverflow.com/questions/15532493/mvc-custom-route-gives-404

也就是说,我可以在浏览器中输入不带问题标题的URL,并自动附加。

我如何在我的应用程序中实现相同的结果? (注意:我知道问题标题不会影响呈现的页面。)

我有一个名为Users的控制器,其操作方法名为Details。我定义了以下路线:

routes.MapRoute("UserRoute",
    "Users/{*domain}",
     new { controller = "User", action = "Details" },
     new { action = "^Details$" });

由于这是一个Intranet应用程序,因此用户将根据其Windows帐户进行身份验证。我想将域和用户名附加到URL。

如果我在视图中生成这样的URL:

@Html.ActionLink("Model.UserName", "Details", "User", new { domain = Model.Identity.Replace("\\", "/") })

我得到一个如下所示的网址:

  

域/用户/ ACME / jsmith的

但是,如果用户使用浏览器导航栏导航到URL Domain/Users/,则它会匹配路径,并且用户将进入用户详细信息页面。在这种情况下,我想将ACME/jsmith/附加到网址上。

到目前为止我所做的研究表明,我可能必须通过派生RouteBase并实施GetRouteDataGetVirtualPath方法来实现自定义路由对象,但我不知道在哪里从这开始(msdn documentaiton很薄)。

所以我想知道的是:

  1. 有没有办法在不实施自定义路线的情况下实现这一目标?
  2. 如果没有,有没有人知道有什么好的资源让我开始实施自定义路线?
  3. 如果需要自定义路由实现,它如何获取可能必须从数据库加载的信息?是否可以让一个服务在路由中进行数据库调用(这对我来说似乎是错误的),或者可以通过MVC框架将信息传递给路由?

2 个答案:

答案 0 :(得分:3)

实际上非常简单。由于标题只是出于搜索引擎优化的原因,你不需要得到实际的问题,所以问题控制器(在这种情况下)将根据id(在URL中)加载正确的问题,并用301重定向用户状态代码。

您可以使用任何Web检查器

查看此行为

enter image description here

答案 1 :(得分:1)

你可以使用Javascript在客户端进行:

history.pushState({}, /* Title Here */, /* URL Here */ );

唯一的缺点是并非所有浏览器都支持它。