根据OData Uri约定http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption,以下Uri是有效的。http://services.odata.org/OData/OData.svc/Category(1)/Products(http://services.odata.org/OData/OData.svc/Category(1%29/Products)?$top=2&$orderby=name
然而,ASP.NET Web-API似乎不支持这一点(至少开箱即用)。它给出了一个错误,即它找不到名为Category(1)的控制器。
如何在Web-API中实现这一点,或者有什么变通方法?
发布于 2012-05-28 05:05:40
我不知道为什么当你问it..but时,你的问题没有引起人们的注意,这是一个真正的问题。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和括号被排除时,第二条路由将被捕获。您需要两个路由,因为没有一种很好的方法自动过滤掉括号。
顺便说一句,你可能会对another answer I wrote感兴趣,它可以识别出你可能会遇到的一些其他路线--体操。
https://stackoverflow.com/questions/10601720
复制相似问题