ASP.. NET Web API路由和动作选择

本文关键字:选择 路由 NET Web API ASP | 更新日期: 2023-09-27 18:19:03

我有一个问题,我的路由和操作选择为我的控制器。我的路由看起来像:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}/{action}",
    defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional });   

我的控制器看起来像:

[HttpGet]
public Customers GetCustomers()
{
}
[HttpGet]
public Customer GetCustomerDetail(int id)
{
}
[ActionName("orders")]
[HttpGet]
public Orders GetCustomerOrders(int id)
{
}

我可以调用http://localhost/customershttp://localhost/customers/1/orders。但是当我尝试调用http://localhost/customers/1时,我会得到错误提示"发现多个操作与请求匹配:"(匹配到GetCustomerDetail和GetCustomerOrders)。

你知道怎么解决这个问题吗?

THX

ASP.. NET Web API路由和动作选择

您可以将路由更改为:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}",
    defaults: new { action = "GetCustomers" });
config.Routes.MapHttpRoute(
    name: "DefaultApiWithIdAndAction",
    routeTemplate: "{controller}/{id}/{action}",
    defaults: new { action="GetCustomerDetail" });

编辑:如果你所有的控制器方法都遵循相同的模式,你可以这样做:

[ActionName("default")]
[HttpGet]
public Customers GetCustomers()
{
}
[ActionName("default")]
[HttpGet]
public Customer GetCustomerDetail(int id)
{
}
[ActionName("orders")]
[HttpGet]
public Orders GetCustomerOrders(int id)
{
}

然后你可以使用一个路由:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}/{action}",
    defaults: new { id = RouteParameter.Optional, action = "default" });