首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET Web-api支持Odata资源路径吗?

ASP.NET Web-api支持Odata资源路径吗?
EN

Stack Overflow用户
提问于 2012-05-15 21:26:40
回答 1查看 1K关注 0票数 4

根据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中实现这一点,或者有什么变通方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-28 05:05:40

我不知道为什么当你问it..but时,你的问题没有引起人们的注意,这是一个真正的问题。WebAPI支持OData规范的很大一部分,但据我所知并不是全部。尽管如此,我还没有找到一个资源来准确地描述哪些方面是有效的。默认路由开箱即可支持一层嵌套,而不是您示例中的两层。所以就像这样:

代码语言:javascript
复制
mystuff.com/Category/5?$top2&orderby=name

有了这句话,我认为你可以创造出你想要的东西。我还没有编译/测试所有这些,所以请容忍我……在global.asax中设置一对路由,如下所示:

代码语言:javascript
复制
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}        );

注意我注册路由的顺序--将类别过滤器放在的第一位。这些路由的相应控制器将如下所示::

代码语言:javascript
复制
 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感兴趣,它可以识别出你可能会遇到的一些其他路线--体操。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10601720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档