如何在默认控制器的URL中跳过控制器?

时间:2018-07-25 12:06:31

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

在ASP.NET Core 2.1 MVC中,我具有以下映射路线:

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

HomeController有操作

  • Index显示默认网站页面
  • Projects显示项目列表
  • Project显示有关特定项目的详细信息(具有其ID作为输入)

项目中还有其他控制器。

我希望通过以下方式更新路由:

  • Home控制器操作被映射而URL中没有Home。我不想在路由定义中列出所有动作,该规则应该是通用的。
    • HomeController.Index => /
    • HomeController.Projects => /Projects(或更小写的projects
    • HomeController.Project(id: 4) => /Project/4(或更小写的project/4
  • 其他控制器遵循标准的ASP.NET路由机制Controller/Action

实现此目标的推荐方法是什么?有可能吗?

2 个答案:

答案 0 :(得分:1)

routes.MapRoute(
    name: "other",
    template: "{controller}/{action}/{id?}");

routes.MapRoute(
    name: "home",
    template: "{action=Index}/{id?}",
    defaults: new { controller = "Home" });

答案 1 :(得分:0)

要定义默认控制器而不在url中指定它,只需将其添加到“ defaults”参数中

要将这种路由结合到一条规则中,使用相同的基本url(即使用/Products/Products/4)会更干净。然后,您可以使用:

routes.MapRoute(
    name: "products",
    template: "Products/{id?}",
    defaults: new { controller = "Home", Action = "Products" });

根据您的结构,类似这样的方法应该起作用:

routes.MapRoute(
    name: "products",
    template: "{Action:regex(^(Products|Product)$)/{id?}",
    defaults: new { controller = "Home" });

要处理不符合此规则的网址(包括基本/),请在product-route之后添加原始默认路由。

routes.MapRoute(
    name: "products",
    template: "{Action:regex(^(Products|Product)$)/{id?}",
    defaults: new { controller = "Home" });
routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");