默认路由不适用于区域路由

时间:2019-04-07 11:43:16

标签: c# asp.net-core asp.net-core-mvc

我正在ASP.NET Core 2.2中创建一个应用程序。在Startup.cs文件中,已经有一条默认路由,我为管理区域定义了另一条路由:

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

Admin角色使用[Authorize(Roles = "Admin")]授权管理区。但是,当我启动该应用程序时,默认情况下它会调用该区域路由,尽管用户看不到任何东西并且他得到了未经授权的页面。为什么应用程序将区域路由用作默认路由?

1 个答案:

答案 0 :(得分:2)

通过说{area=Admin},您可以将area部分设为可选。因此,不包含区域的路由也将与此匹配(以Admin为选定区域)。

如果您要确保只有路径/Admin/会触发您的区域,则可以这样做:

routes.MapRoute(
    name: "admin",
    template: "Admin/{controller=User}/{action=Index}/{id?}",
    defaults: new { area = "Admin" });

您还可以使用此快捷方法来为您的区域设置路线约束:

routes.MapAreaRoute("admin", "Admin",
    "Admin/{controller=User}/{action=Index}/{id?}");

此外,您注册路线的顺序也很重要。通常,将使用与路线匹配的第一个路线模板。因此,由于您的管理路由非常具体,您应该首先列出该路由,然后再回退到默认路由。

作为documentation on routing areas in MVC explains

  

常规工艺路线取决于订单。通常,带有区域的路由应比没有区域的路由更具体地放在路由表中。