自定义IRouteHandler路由搞砸MVC链接建设

时间:2010-12-04 01:31:54

标签: asp.net-mvc-2 iroutehandler

我在ASP.NET MVC2中有一个自定义路由处理程序来捕获所有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构建逻辑以考虑默认路由模式?

2 个答案:

答案 0 :(得分:1)

我想出了一个黑客来阻止所描述的行为。虽然这“解决了”这个问题,但它真的很讨厌,我更喜欢用更简洁的方法从虚拟路径构建逻辑中排除路径

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”时,才会为虚拟路径构建选择路由,这种情况很可能无法实现。我说这很讨厌。

答案 1 :(得分:0)

您可以使用RouteLink帮助程序指定路径名称:

<%: Html.RouteLink("link text", "Default", 
    new { action = "add", controller = "home" }) %>