具有id和子动作的MVC路由

时间:2012-10-04 09:35:27

标签: routes asp.net-web-api

我无法弄清楚我需要使用MVC路由来完成这项工作

这是我的一条路线:

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

请求 / Shipments / 效果很好。

请求 / Shipments / 3 / Packages 效果很好。

请求 / Shipments / 3 但失败并显示错误:

  

找到与请求匹配的多个操作:   System.Linq.IQueryable`1 [Api.Controllers.RequisitionsController + PackageRequisitionWithTracking]   GetPackageRequisitions(Int32)类型   Api.Controllers.RequisitionsController Api.Models.ShipmentRequisition   GetShipmentRequisitions(Int32)类型   Api.Controllers.RequisitionsController

似乎无法区分:

// No ActionName    
public ShipmentRequisition GetShipmentRequisitions(int id)

[ActionName("Packages")]
public IQueryable<PackageRequisitionWithTracking> GetPackageRequisitions(int id)

我原以为在id上获取货物时缺少行动名称会让该路线发挥作用。

1 个答案:

答案 0 :(得分:0)

这里已经回答了几次 - 你不能混合REST样式路由(你要求控制器使用GET,它返回默认的Get动作)和RPC路由(你提供明确的动作名称)在路径中)单控制器

Web API不知道将哪个操作用作默认的“GET”操作。

ASP.NET Web Stack的Codeplex上的Web API团队有一个问题 - http://aspnetwebstack.codeplex.com/workitem/184

现在最好的办法是将控制器分为使用REST路由(基于HTTP谓词的路由)和RPC路由(基于URL中的操作名称的路由)的控制器。