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

时间:2018-01-16 00:58:00

标签: asp.net-mvc asp.net-core asp.net-mvc-routing

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

    • 管理
        • 主页
          • Index.cshtml
      • 控制器
        • HomeController.cs
  • 控制器
    • HomeController.cs
    • ManageController.cs
    • 主页
      • Index.cshtml
    • 管理
      • Index.cshtml

我想在_Layout.cshtml中有路由,例如/ controllers / manage / index,当不在某个区域时以及在admin等区域时都可以使用。使用HtmlHelper语法或TagHelper语法我该如何创建它?

期望的输出:

  

www.website.com/manage

我试过了

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

不在某个区域时有效,但在管理区域内生成链接:

  

www.website.com/admin

我在启动配置(IapplicationBuilder应用程序)中注册了以下路由

// 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 个答案:

答案 0 :(得分:4)

问题是你要两次注册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?}");
});