@Html.ActionLink по умолчанию не ссылается на текущую область

У меня есть 2 области Admin и FrontEnd (именно в таком порядке).

Когда я нахожусь в представлении в области FrontEnd, ActionLink всегда указывает на область Admin:

@Html.ActionLink("Checkout", "Address", "Checkout")

Будет http://localhost:53600/admin/Checkout/Address, но контроллер Checkout находится в моей области FrontEnd.

Я знаю, что могу решить эту проблему, указав объект routedata в ссылке действия и установив area = "FrontEnd", но я не хочу. Я хочу, чтобы помощник ActionLink по умолчанию использовал мой текущий маршрут.

Это возможно?

Все вопросы, которые я читал на actionlink, — это люди, которые спрашивают, как сделать ссылку на другую область, что указывает на то, что по умолчанию для них используется текущая область. Я один с этой проблемой?

Изменить, это мои маршруты, которые, как вы видите, привязаны к правильному пространству имен:

Администратор

public void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute(
        "Administration_default",
        "admin/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", area = "Administration", id = UrlParameter.Optional },
        new[] { "CC.Web.Areas.Administration.Controllers" }
        );
}

Внешний интерфейс

public void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute("Default",
        "{controller}/{action}/{id}",
        new {controller = "Home", action = "Index", area = "FrontEnd", id = UrlParameter.Optional},
        new[] {"CC.Web.Areas.FrontEnd.Controllers"}
        );
}

person webnoob    schedule 19.11.2014    source источник


Ответы (1)


Области должны быть зарегистрированы в классах, производных от AreaRegistration, переопределяющих метод void RegisterArea(AreaRegistrationContext context), см. ).aspx" rel="nofollow">msdn.

AreaRegistrationContext определяет свои собственные методы для регистрации области маршруты, которые добавят необходимые dataTokens для областей, которые используются при создании ссылок и URL-адресов:

public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
{
    if (namespaces == null && Namespaces != null)
    {
        namespaces = Namespaces.ToArray();
    }

    Route route = Routes.MapRoute(name, url, defaults, constraints, namespaces);
    route.DataTokens[RouteDataTokenKeys.Area] = AreaName;

    // disabling the namespace lookup fallback mechanism keeps this areas from accidentally picking up
    // controllers belonging to other areas
    bool useNamespaceFallback = (namespaces == null || namespaces.Length == 0);
    route.DataTokens[RouteDataTokenKeys.UseNamespaceFallback] = useNamespaceFallback;

    return route;
}

Также похоже, что FrontEnd не должен быть областью, поэтому вы можете просто иметь стандартные контроллеры и представления MVC (вместо области fronteand) с дополнительной областью администратора:

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Administration";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Administration_default",
            "admin/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "CC.Web.Areas.Administration.Controllers" }
        );
    }
}

Помните, что вы должны вызывать AreaRegistration.RegisterAllAreas(); в начале вашего основного метода RegisterRoutes, вызываемого при запуске приложения.

person Daniel J.G.    schedule 19.11.2014
comment
Спасибо, Даниил, очень признателен. Как ни странно, я уже звонил в AreaRegistration.RegisterAllAreas();, просто у меня не было настроенных маршрутов для получения из AreaRegistration. - person webnoob; 19.11.2014