我在ASP.NET MVC2中有一个自定义的RouteHandler,可以在这样的前缀路径上捕获所有URL:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new Route("@api/{*all}", new ApiHandler()));
routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

路由工作正常,但是如果我使用html.actionlink或控制器返回returntoAction(),则URI构建会创建一个损坏的URI:

/@api?action=Add&controller=Home

代替

/Home/Add

我如何影响URI构建逻辑以考虑默认路由模式?

有帮助吗?

解决方案

我想出了一个黑客来停止所描述的行为。虽然这“解决”了问题,但确实有点讨厌,我更喜欢一种清洁的方式来排除虚拟路径构建逻辑的路线

routes.Add(
  new Route("@api/{*all}",
  // A random and unlikely controller name as the default
  new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } },
  // and a constraint requiring any controller to be that random, default value
  new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } }, 
  new ApiHandler()
);

这意味着只有在有问题的控制器为“ Qwewqewqeqweq”的情况下,仅供虚拟路径构建路线,希望这不太可能。我说这很讨厌。

其他提示

您可以使用 RouteLink 帮手:

<%: Html.RouteLink("link text", "Default", 
    new { action = "add", controller = "home" }) %>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top