10

如果我导航到以下 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$" });

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

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

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

我得到一个如下所示的 URL:

域/用户/ACME/jsmith

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

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

所以我想知道的是:

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

2 回答 2

3

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

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

在此处输入图像描述

于 2013-04-09T18:25:58.600 回答
1

您可以使用 Javascript 在客户端执行此操作:

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

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

于 2013-04-09T14:20:49.430 回答