Пользовательский маршрут IRouteHandler портит создание ссылок MVC - PullRequest
1 голос
/ 04 декабря 2010

У меня есть специальный обработчик маршрута в 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 ]

1 голос
/ 04 декабря 2010

Я придумал хак, чтобы остановить описанное поведение. Хотя это «решает» проблему, это действительно немного неприятно, и я бы предпочел более чистый способ исключения маршрута из логики построения виртуального пути

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", что, как мы надеемся, маловероятно. Я сказал, что это противно.

0 голосов
/ 04 декабря 2010

Вы можете указать название маршрута с помощью помощника RouteLink:

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