【问题标题】:@Html.ActionLink is not linking to current area by default@Html.ActionLink 默认不链接到当前区域
【发布时间】:2014-11-19 09:46:10
【问题描述】:

我有 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"}
        );
}

【问题讨论】:

  • 您真的在使用区域吗?如果是这样,您应该使用AreaRegistration 类来注册这些区域及其路线。见msdn
  • 看起来前端不应该是一个区域,所以你可以只拥有标准的 MVC 控制器和带有额外管理区域的视图。
  • @DanielJ.G.我大约 15 分钟前读到了这篇文章,并注意到这是问题所在。它也解决了我的问题。随意按照这些思路发布答案,我会接受(尽管我还是找到了它)。感谢该地区的建议。

标签: asp.net-mvc razor actionlink html.actionlink asp.net-mvc-5.2


【解决方案1】:

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

AreaRegistrationContext 定义了它的own methods 来注册区域路由,这些路由将为生成链接和 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;
}

看起来 FrontEnd 不应该是一个区域,因此您可以只拥有标准的 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" }
        );
    }
}

请记住,您应该在应用启动时调用的主要 RegisterRoutes 方法开始时调用 AreaRegistration.RegisterAllAreas();

【讨论】:

  • 谢谢丹尼尔,非常感谢。奇怪的是,我已经调用了AreaRegistration.RegisterAllAreas(); 我只是没有设置从AreaRegistration 派生的路由。
猜你喜欢
  • 2011-06-18
  • 2018-10-27
  • 2013-01-01
  • 2013-06-02
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 2021-03-18
相关资源
最近更新 更多