ServiceRoute в ASP.NET MVC с областями перехватывает ActionLink для дома

У меня есть приложение MVC 3 с областями, и я предоставляю сервис из определенной области и контроллера. Маршрутизация к этому сервису определяется внутри AreaRegistration следующим образом

public class AreaAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Area"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.Routes.Add(
            new ServiceRoute("Area/Controller/Service",
                new NinjectServiceHostFactory(), typeof(MyService)));

        // ....
    }
}

В моем Global.asax.cs Я определяю только маршрут по умолчанию

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

В моем _Layout.chshtml У меня есть ссылка на мою домашнюю страницу, где я даю пустую область, и я ожидаю, что она найдет Index действие в HomeController в Controllers Папка вверху (вне папки Области):

@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)

По какой-то причине это ActionLink отображается как

~/Area/Controller/Service?action=Index&controller=Home

Если я закомментирую ServiceRoute, то же самое ActionLink указывает на ~/ чего я и ожидаю

Любые идеи, как исправить эту проблему маршрутизации? Единственный обходной путь, который я нашел, состоит в том, чтобы использовать это вместо этого:

<a href="@Url.Content("~/")">Home</a>

1 ответ

У нас была точно такая же проблема. Порядок регистрации маршрутов, по-видимому, является проблемой, так как маршруты из областей будут регистрироваться до маршрутов из кода global.asax.

Чтобы устранить эту проблему, разрешив URL-адрес к службе, а также не нацелив обратную передачу на URL-адрес службы, попробуйте переместить добавление ServiceRoute в Global.asax.cs после регистрации другого маршрута.

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

    context.Routes.Add(
        new ServiceRoute("Area/Controller/Service",
            new NinjectServiceHostFactory(), typeof(MyService)));

}

Это сработало для нас, но, конечно, связано с накладными расходами на размещение кода, относящегося к области, в основном проекте.

Другие вопросы по тегам