Маршруты оцениваются в том же порядке, в котором они зарегистрированы.Вы можете использовать RouteLink
, чтобы явно указать имя маршрута:
@Html.RouteLink("About", "Default", new { action = "About" })
Если вы измените порядок определений, ссылки будут сгенерированы правильно, но ваш пользовательский маршрут не будет найден при запросе URL JsAction/
так как нет никакого значения для устранения неоднозначности этого URL из маршрута по умолчанию.
Вам придется переосмыслить структуру маршрутов, чтобы таких конфликтов не было.Вы можете использовать ограничения.Помните, что маршрут по умолчанию очень активен, и если вы не ограничите его, он будет иметь приоритет.
Одна из возможностей - определить контроллер и действие для вашего пользовательского маршрута:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
);
}
, а затем ограничьте пользовательский маршрут, указав контроллер и выполняемое действие:
public static readonly Route JsActionRoute = new Route(
"JsAction",
new RouteValueDictionary(new { action = "JsAction", controller = "Foo" })
new JsAction.JsActionHandler()
);
Другая возможность - изменить порядок определения ваших маршрутов и ограничить маршрут по умолчанию:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = "^((?!JsAction).)*$", action = "^((?!JsAction).)*$" }
);
routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute);
}