4

根据 OData Uri 约定http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption以下 Uri 是有效的。 http://services.odata.org/OData/OData.svc/Category(1)/Products ?$top=2&$orderby=name

但是 ASP.NET Web-API 似乎不支持这一点(至少开箱即用)。它给出了一个错误,即找不到名为 Category(1) 的控制器。

如何使用 Web-API 进行这项工作,或者是否有解决方法?

4

1 回答 1

5

我不知道为什么当你问的时候你的问题没有引起注意……但这是一个真正的问题。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 和括号时,第二条路线将被捕获。您需要两条路线,因为没有一种自动过滤掉括号的好方法。

作为旁注,您可能对我写的另一个答案感兴趣,该答案确定了您可能会遇到的其他一些路线体操。

于 2012-05-27T21:05:40.410 回答