您可以使用这样的路线:
routes.MapRoute("", "{*link}",
new { action = "oldlink", controller = "home" });
这会将所有请求定向到以下控制器和操作方法:
public class HomeController : Controller
{
public ActionResult OldLink(string link)
{
//implement method...
return View((object)link);
}
}
星号表示该段是所谓的“catchall”段。这允许您将任意长度的 URL 匹配到单个路由。在此路由中,URL 中主机名之后的所有段都分配给“链接”字符串变量。
例如,如果您输入 URL:
http://localhost/foo/bar/file.html
它将路由到 OldLink 方法,并且“link”字符串变量将具有值
"foo/bar/file.html"
这条路线有几点需要注意:
此路由的 URL 模式将匹配所有传入的 URL。因此,应用程序中的任何 URL 都将路由到“home”控制器上的“oldlink”操作。使用此路由,您将无法获取任何 URL 以转到任何其他路由。
默认情况下,ASP.Net 路由引擎将首先检查磁盘上是否存在与 URL 匹配的物理文件。这样,你就不用担心路由系统对静态文件的路由请求了,比如css或者javascript文件。这意味着如果将 URL 发送到与磁盘上的文件匹配的应用程序,它将不会被路由到“home”控制器上的“oldlink”操作。如果要更改此默认行为并让路由引擎路由所有内容,包括对静态文件的请求,则需要将以下行添加到 global.asax 文件的“RegisterRoutes”方法中:
路线.RouteExistingFiles = true;
有关 URL 段中包罗万象的路由段的更多信息,请参阅这篇关于路由的优秀 MSDN 文章中标题为“在 URL 模式中处理可变数量的段”的部分。有关 RouteExistingFiles 属性的更多信息,请参见此处。