【问题标题】:Route to different actions with the same url with different params使用相同的 url 和不同的参数路由到不同的操作
【发布时间】:2017-08-07 15:23:58
【问题描述】:

我正在使用这样的路线构建 api: /items/items/{id}。 现在我想将此路由路由到两个不同的操作。我无法使用属性对其进行配置,这是配置:

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

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

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

【问题讨论】:

  • 将第二个动作改为GetByID,并在路由中重命名以匹配。
  • 感谢您的建议。这是最简单的解决方案。你知道其他方法吗?
  • 为什么不能配置属性?
  • FWIW,你所拥有的应该可以正常工作,除了两条路线都被采取相同的行动,这是你说你明确不想要的。真正的问题是什么?
  • @IvanRubanau 展示了您尝试映射到的两个不同操作的示例

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


【解决方案1】:

不可能有 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?}");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多