使用具有不同参数的相同 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?}");
我正在构建 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?}");