Вопрос

У меня есть пользовательский artehancandler в 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 или возврату возврата () из контроллера, 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