使用具有不同参数的相同 url 路由到不同的操作

Route to different actions with the same url with different params

我正在构建 api 使用这样的路线: /items/items/{id}。 现在我想将这条路线路由到两个不同的动作。我无法使用属性配置它,这里是配置:

routes.MapRoute(
    "route1", 
    "/items", 
    new { controller = "Items", action = "Get" });

routes.MapRoute(
    "route2", 
    "/items/{id}", 
    new { controller = "Items", action = "Get" });

但是这条路线行不通。我哪里错了?

不可能有 2 个具有相同名称的操作方法并使用路由模板映射它们,除非这些方法映射到不同的 HTTP 方法(所有这一切都是由于模型绑定的工作方式):

public class ProductsController : Controller
{
   public IActionResult Edit(int id) { ... }

   [HttpPost]
   public IActionResult Edit(int id, Product product) { ... }
}

但是,是的,使用属性路由可以做到这一点。如果您不能使用这种方法,那么您只有以下选择:

  • 重命名其中一个动作的名称;
  • 使用可选的 id 参数将两个操作合二为一。
    public class ItemsController : Controller
    {
        public IActionResult Get(int? id) 
        { 
            if (id.HasValue())
            { // logic as in second action }
            else
            { // first action logic }
        }
    }

并将路由定义为

routes.MapRoute(
    name: "route",
    template: "{controller=Items}/{action=Get}/{id?}");