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

Ben*_*ale 10 c# url asp.net-routing asp.net-mvc-3

如果我导航到以下stackoverflow URL,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$" });
Run Code Online (Sandbox Code Playgroud)

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

如果我在视图中生成URL,如下所示:

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

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

域/用户/ ACME/JSMITH

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

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

所以我想知道的是:

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

tuc*_*caz 3

其实很简单。由于标题只是出于 SEO 原因而存在,因此您不需要了解实际问题,因此问题控制器(在这种情况下)将根据 id(在 URL 中)加载正确的问题,并使用 301 重定向用户状态码。

您可以使用任何网络检查器看到此行为

在此输入图像描述