我不知道为什么当你问的时候你的问题没有引起注意……但这是一个真正的问题。WebAPI 支持大量的 OData 规范,但据我了解并非全部。虽然,我还没有找到准确描述哪些方面起作用的资源。开箱即用的默认路由支持一层嵌套,而不是像您的示例中那样的两层。所以像:
mystuff.com/Category/5?$top2&orderby=name
话虽如此,我认为您可以制作出您想要的东西。我还没有编译/测试所有这些,所以请耐心等待......在global.asax
设置一对这样的路线:
routes.MapHttpRoute(name : "WithCategoryFilter",
routeTemplate : "api/v1/{controller}({catID})/{action}/{id}",
defaults : new { id = RouteParameter.Optional} );
routes.MapHttpRoute(name : "WithoutCatFilter",
routeTemplate : "api/v1/{controller}/{action}/{id}",
defaults : new { id = RouteParameter.Optional} );
注意我注册路由的顺序——把类别过滤器放在第一位。这些路由的相应控制器看起来像: :
public class ProductCategoryController : BaseAPIController {
public IEnumerable<Product> Products(int catID, int id) {
var result = new List<Product>();
//do category filtering here...
return result;
}
}
因此,第一条路线将允许应用类别过滤器 ( catID
) 和可选的 ProductID ( id
)。当排除 categoryID 和括号时,第二条路线将被捕获。您需要两条路线,因为没有一种自动过滤掉括号的好方法。
作为旁注,您可能对我写的另一个答案感兴趣,该答案确定了您可能会遇到的其他一些路线体操。