C# 如何在url中跳过默认控制器的控制器?

C# 如何在url中跳过默认控制器的控制器?,c#,asp.net,asp.net-mvc,asp.net-core,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具有操作 索引显示默认站点页面 项目显示项目列表 Project显示特定项目的详细信息(将其id作为输入) 项目中还有其他控制器 我希望以如下方式更新路由: Home控制器动作映射时,url中没有Home。我不

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

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

  • 索引
    显示默认站点页面
  • 项目
    显示项目列表
  • Project
    显示特定项目的详细信息(将其id作为输入)
项目中还有其他控制器

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

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

实现这一目标的推荐方法是什么?可以定义默认控制器而不在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" });
要处理与此规则不匹配的URL,包括基本
/
,请在产品路由之后添加原始默认路由

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

“列出路由定义中的所有操作”是什么意思?使用当前地图路线,不需要指定任何其他内容。控制器及其操作将自动具有路由{myurl}/ControllerName/actionName我的意思是,我不想在主控制器中为/projects、为/project/4、为其他操作设置另一个规则(我没有列出所有规则),我更喜欢有一个规则,它将匹配主控制器中的所有操作,并生成一个没有主控制器的url。默认规则将为HomeController.Products操作生成/Home/Products,但应为/Products。
routes.MapRoute(
    name: "other",
    template: "{controller}/{action}/{id?}");

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