.NET Core 2.0 从区域路由到非区域的正确方法

.NET Core 2.0 Correct way to route from area to nonarea

我有一个 .NET Core 2.0 MVC 应用程序,其中包含一个名为 admin 的区域。

我想要 _Layout.cshtml 中的路由,例如 /controllers/manage/index,当不在某个区域时和在管理区域时都可以使用。使用 HtmlHelper 语法或 TagHelper 语法如何创建它?

期望的输出:

www.website.com/manage

我试过了

<a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Manage</a>

不在某个区域时有效,但在管理区域时会产生 link 到:

www.website.com/admin

我在 Startup Configure(IapplicationBuilder app) 中注册了以下路由

// Route for areas
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "areas",
        template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );
});

// Default route
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

问题是您注册了两次 MVC。

// Route for areas
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "areas",
        template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );
});

// Default route
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

在这种情况下,最后一次注册会覆盖第一个,因此您实际上只注册了 1 条路线(区域没有路线)。

要解决此问题,您只需注册 MVC 一次并将所有路由放入该实例中。

app.UseMvc(routes =>
{
    // Route for areas
    routes.MapRoute(
        name: "areas",
        template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );

    // Default route
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});