根据OData Uri约定http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption,以下Uri有效。 http://services.odata.org/OData/OData.svc/Category(1)/Products $顶部= 2&安培; $的OrderBy =名称
然而,ASP.NET Web-API似乎并不支持这一点(至少开箱即用)。它给出了一个错误,即无法找到名为Category(1)的控制器。
如何使用Web-API实现这项功能还是有解决方法?
答案 0 :(得分:4)
我不确定为什么你的问题在你提出问题时没有引起注意......但这是一个真正的问题。 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&amp;括号排除第二条路线将被捕获。您需要两条路线,因为没有一种很好的方法可以自动过滤掉括号。
作为旁注,你可能会对another answer I wrote感兴趣,这可能会识别你可能会遇到的其他一些路线体操。