我可以(不使用 runAllManagedModulesForAllRequests = true)将带有 *.html 的 url 路由到默认 Controller /操作模式吗?
我需要将所有对 www.myhost.com/any/any/abcd.html 的请求路由到 www.myhost.com/home/oldlink 并使用“link”RouteData key =“any/any/abcd.html”
我尝试了使用 {*link} 和约束 link = ".html$"的 MapRoute,但所有请求都带有点 - catch StaticFileHandler...
最佳答案
您可以使用这样的路线:
routes.MapRoute("", "{*link}",
new { action = "oldlink", controller = "home" });
这会将所有请求定向到以下 Controller 和操作方法:
public class HomeController : Controller
{
public ActionResult OldLink(string link)
{
//implement method...
return View((object)link);
}
}
星号表示该段是所谓的“包罗万象”的段。这允许您将任意长度的 URL 与单个路由相匹配。在此路由中,主机名后面的 URL 中的所有段都分配给“link”字符串变量。
例如,如果您输入 URL:
http://localhost/foo/bar/file.html
它将路由到 OldLink 方法,并且“link”字符串变量将具有该值
"foo/bar/file.html"
关于这条路线需要注意的几点:
此路由的网址模式将匹配所有传入网址。因此,应用程序中的任何 URL 都将路由到“home” Controller 上的“oldlink”操作。使用此路由,您将无法获取任何 URL 来转到任何其他路由。
默认情况下,ASP.Net 路由引擎将首先检查磁盘上是否存在与 URL 匹配的物理文件。这样,您就不需要担心路由系统路由静态文件的请求,例如css或javascript文件。这意味着,如果将 URL 发送到与磁盘上的文件匹配的应用程序,则该 URL 不会被路由到“home” Controller 上的“oldlink”操作。如果您想更改此默认行为并使路由引擎路由所有内容,包括对静态文件的请求,则需要将以下行添加到 global.asax 文件上的“RegisterRoutes”方法中:
routes.RouteExistingFiles = true;
有关 URL 段中的包罗万象的路由段的更多信息,请参阅这篇优秀的 MSDN article on routing 中标题为“处理 URL 模式中可变数量的段”的部分。 。有关 RouteExistingFiles 属性的详细信息,see here .
关于asp.net-mvc - 如何在 ASP.Net MVC 中设置路由以使 html 文件请求绕过 StaticFileHandler 并由路由引擎处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14819837/