Asp.net mvc 2 自定义IRouteHandler路由将MVC链接构建搞砸

Asp.net mvc 2 自定义IRouteHandler路由将MVC链接构建搞砸,asp.net-mvc-2,iroutehandler,Asp.net Mvc 2,Iroutehandler,我在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

我在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
);
/@api?action=Add&controller=Home
路由工作正常,但是如果我从控制器使用Html.Actionlink或return ReturnToAction(),构建的uri会创建一个断开的uri,如下所示:

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
);
/@api?action=Add&controller=Home
而不是

/Home/Add

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

,可以使用<代码>路由规则> /代码>帮助器指定路由的名称:

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

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

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

我想出了一个方法来阻止所描述的行为。虽然这“解决”了问题,但它确实有点令人讨厌,我更喜欢一种更干净的方法,将路由从虚拟路径构建逻辑中排除

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()
);

这意味着,如果所讨论的控制器是“qwewqewqeqeqweq”,则只会选择用于虚拟路径构建的路由,希望这不太可能。我说这很糟糕。

我想出了一个办法来阻止所描述的行为。虽然这“解决”了问题,但它确实有点令人讨厌,我更喜欢一种更干净的方法,将路由从虚拟路径构建逻辑中排除

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()
);

这意味着,如果所讨论的控制器是“qwewqewqeqeqweq”,则只会选择用于虚拟路径构建的路由,希望这不太可能。我说这很糟糕。

我讨厌把负担推到我想建立的每个链接上,仅仅因为我有一个错误地篡夺了正确的路由。我讨厌把负担推到我想建立的每个链接上,仅仅因为我有一个错误地篡夺了正确路由的路由。