2

我有 2 个区域AdminFrontEnd(按此顺序)。

当我在 FrontEnd 区域的视图中时,ActionLink始终指向该Admin区域:

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

会,http://localhost:53600/admin/Checkout/Address但结帐控制器在我的前端区域。

我知道我可以通过在操作链接和设置中指定一个 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"}
        );
}
4

1 回答 1

1

区域应该在派生自AreaRegistration重写方法的类中注册void RegisterArea(AreaRegistrationContext context),请参阅msdn

AreaRegistrationContext定义了自己的方法来注册区域路由,这些路由将为生成链接和 url 时使用的区域添加所需的 dataToken:

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

看起来前端不应该是一个区域,所以你可以只拥有标准的 MVC 控制器和视图(而不是前端区域)和一个额外的管理区域:

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 方法开始时调用。

于 2014-11-19T10:47:40.573 回答